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
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)
639
class UnstackableLocationError(BzrError):
641
_fmt = "The branch '%(branch_url)s' cannot be stacked on '%(target_url)s'."
643
def __init__(self, branch_url, target_url):
644
BzrError.__init__(self)
645
self.branch_url = branch_url
646
self.target_url = target_url
649
639
class UnstackableRepositoryFormat(BzrError):
651
641
_fmt = ("The repository '%(url)s'(%(format)s) is not a stackable format. "
702
692
# TODO: Probably this behavior of should be a common superclass
703
693
class NotBranchError(PathError):
705
_fmt = 'Not a branch: "%(path)s"%(detail)s.'
695
_fmt = 'Not a branch: "%(path)s".'
707
def __init__(self, path, detail=None, bzrdir=None):
697
def __init__(self, path):
708
698
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)
699
self.path = urlutils.unescape_for_display(path, 'ascii')
745
702
class NoSubmitBranch(PathError):
795
752
_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
754
def __init__(self, branch, path):
800
755
BzrError.__init__(self)
801
756
self.branch = branch
830
785
class IncompatibleRepositories(BzrError):
831
"""Report an error that two repositories are not compatible.
833
Note that the source and target repositories are permitted to be strings:
834
this exception is thrown from the smart server and may refer to a
835
repository the client hasn't opened.
838
787
_fmt = "%(target)s\n" \
839
788
"is not compatible with\n" \
864
813
"""Construct a new AlreadyVersionedError.
866
815
:param path: This is the path which is versioned,
867
which should be in a user friendly form.
816
which should be in a user friendly form.
868
817
:param context_info: If given, this is information about the context,
869
which could explain why this is expected to not be versioned.
818
which could explain why this is expected to not be versioned.
871
820
BzrError.__init__(self)
885
834
"""Construct a new NotVersionedError.
887
836
:param path: This is the path which is not versioned,
888
which should be in a user friendly form.
837
which should be in a user friendly form.
889
838
:param context_info: If given, this is information about the context,
890
which could explain why this is expected to be versioned.
839
which could explain why this is expected to be versioned.
892
841
BzrError.__init__(self)
961
910
# original exception is available as e.original_error
963
912
# New code should prefer to raise specific subclasses
964
def __init__(self, msg):
913
def __init__(self, message):
914
# Python 2.5 uses a slot for StandardError.message,
915
# so use a different variable name. We now work around this in
916
# BzrError.__str__, but this member name is kept for compatability.
968
920
class LockActive(LockError):
1084
1038
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
1041
class LockNotHeld(LockError):
1101
1043
_fmt = "Lock not held: %(lock)s"
1140
1082
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
1085
class BadCommitMessageEncoding(BzrError):
1154
1087
_fmt = 'The specified commit message contains characters unsupported by '\
1210
1143
class InvalidRevisionSpec(BzrError):
1212
_fmt = ("Requested revision: '%(spec)s' does not exist in branch:"
1213
" %(branch_url)s%(extra)s")
1145
_fmt = ("Requested revision: %(spec)r does not exist in branch:"
1146
" %(branch)s%(extra)s")
1215
1148
def __init__(self, spec, branch, extra=None):
1216
1149
BzrError.__init__(self, branch=branch, spec=spec)
1217
self.branch_url = getattr(branch, 'user_url', str(branch))
1219
1151
self.extra = '\n' + str(extra)
1299
1231
class AmbiguousBase(BzrError):
1301
1233
def __init__(self, bases):
1302
symbol_versioning.warn("BzrError AmbiguousBase has been deprecated "
1303
"as of bzrlib 0.8.", DeprecationWarning, stacklevel=2)
1234
warn("BzrError AmbiguousBase has been deprecated as of bzrlib 0.8.",
1304
1236
msg = ("The correct base is unclear, because %s are all equally close"
1305
1237
% ", ".join(bases))
1306
1238
BzrError.__init__(self, msg)
1328
1260
class BoundBranchOutOfDate(BzrError):
1330
1262
_fmt = ("Bound branch %(branch)s is out of date with master branch"
1331
" %(master)s.%(extra_help)s")
1333
1265
def __init__(self, branch, master):
1334
1266
BzrError.__init__(self)
1335
1267
self.branch = branch
1336
1268
self.master = master
1337
self.extra_help = ''
1340
1271
class CommitToDoubleBoundBranch(BzrError):
1412
1343
class WeaveParentMismatch(WeaveError):
1414
_fmt = "Parents are mismatched between two revisions. %(msg)s"
1345
_fmt = "Parents are mismatched between two revisions. %(message)s"
1417
1348
class WeaveInvalidChecksum(WeaveError):
1419
_fmt = "Text did not match its checksum: %(msg)s"
1350
_fmt = "Text did not match it's checksum: %(message)s"
1422
1353
class WeaveTextDiffers(WeaveError):
1716
1647
class InvalidHttpResponse(TransportError):
1718
_fmt = "Invalid http response for %(path)s: %(msg)s%(orig_error)s"
1649
_fmt = "Invalid http response for %(path)s: %(msg)s"
1720
1651
def __init__(self, path, msg, orig_error=None):
1721
1652
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
1653
TransportError.__init__(self, msg, orig_error=orig_error)
1737
1662
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
1665
class InvalidHttpContentType(InvalidHttpResponse):
1755
1667
_fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
1783
1695
_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
1698
class ParseConfigError(BzrError):
1797
_fmt = "Error(s) parsing config file %(filename)s:\n%(errors)s"
1799
1700
def __init__(self, errors, filename):
1800
BzrError.__init__(self)
1801
self.filename = filename
1802
self.errors = '\n'.join(e.msg for e in errors)
1805
class ConfigOptionValueError(BzrError):
1807
_fmt = """Bad value "%(value)s" for option "%(name)s"."""
1809
def __init__(self, name, value):
1810
BzrError.__init__(self, name=name, value=value)
1701
if filename is None:
1703
message = "Error(s) parsing config file %s:\n%s" % \
1704
(filename, ('\n'.join(e.msg for e in errors)))
1705
BzrError.__init__(self, message)
1813
1708
class NoEmailInUsername(BzrError):
1822
1717
class SigningFailed(BzrError):
1824
_fmt = 'Failed to GPG sign data with command "%(command_line)s"'
1719
_fmt = 'Failed to gpg sign data with command "%(command_line)s"'
1826
1721
def __init__(self, command_line):
1827
1722
BzrError.__init__(self, command_line=command_line)
1830
class SignatureVerificationFailed(BzrError):
1832
_fmt = 'Failed to verify GPG signature data with error "%(error)s"'
1834
def __init__(self, error):
1835
BzrError.__init__(self, error=error)
1838
class DependencyNotPresent(BzrError):
1840
_fmt = 'Unable to import library "%(library)s": %(error)s'
1842
def __init__(self, library, error):
1843
BzrError.__init__(self, library=library, error=error)
1846
class GpgmeNotInstalled(DependencyNotPresent):
1848
_fmt = 'python-gpgme is not installed, it is needed to verify signatures'
1850
def __init__(self, error):
1851
DependencyNotPresent.__init__(self, 'gpgme', error)
1854
1725
class WorkingTreeNotRevision(BzrError):
1856
1727
_fmt = ("The working tree for %(basedir)s has changed since"
2016
1887
_fmt = "Moving the root directory is not supported at this time"
2019
class TransformRenameFailed(BzrError):
2021
_fmt = "Failed to rename %(from_path)s to %(to_path)s: %(why)s"
2023
def __init__(self, from_path, to_path, why, errno):
2024
self.from_path = from_path
2025
self.to_path = to_path
2030
1890
class BzrMoveFailedError(BzrError):
2032
_fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
2033
"%(_has_extra)s%(extra)s")
1892
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
2035
1894
def __init__(self, from_path='', to_path='', extra=None):
2036
1895
from bzrlib.osutils import splitpath
2037
1896
BzrError.__init__(self)
2039
self.extra, self._has_extra = extra, ': '
1898
self.extra = ': ' + str(extra)
2041
self.extra = self._has_extra = ''
2043
1902
has_from = len(from_path) > 0
2044
1903
has_to = len(to_path) > 0
2066
1925
class BzrRenameFailedError(BzrMoveFailedError):
2068
_fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
2069
"%(_has_extra)s%(extra)s")
1927
_fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
2071
1929
def __init__(self, from_path, to_path, extra=None):
2072
1930
BzrMoveFailedError.__init__(self, from_path, to_path, extra)
2075
1932
class BzrRemoveChangedFilesError(BzrError):
2076
1933
"""Used when user is trying to remove changed files."""
2080
1937
"Use --keep to not delete them, or --force to delete them regardless.")
2082
1939
def __init__(self, tree_delta):
2083
symbol_versioning.warn(symbol_versioning.deprecated_in((2, 3, 0)) %
2084
"BzrRemoveChangedFilesError", DeprecationWarning, stacklevel=2)
2085
1940
BzrError.__init__(self)
2086
1941
self.changes_as_text = tree_delta.get_changes_as_text()
2087
1942
#self.paths_as_string = '\n'.join(changed_files)
2109
1964
_fmt = "Parameter %(param)s contains a newline."
1967
class DependencyNotPresent(BzrError):
1969
_fmt = 'Unable to import library "%(library)s": %(error)s'
1971
def __init__(self, library, error):
1972
BzrError.__init__(self, library=library, error=error)
2112
1975
class ParamikoNotPresent(DependencyNotPresent):
2114
1977
_fmt = "Unable to import paramiko (required for sftp support): %(error)s"
2134
1997
class BadConversionTarget(BzrError):
2136
_fmt = "Cannot convert from format %(from_format)s to format %(format)s." \
1999
_fmt = "Cannot convert to format %(format)s. %(problem)s"
2139
def __init__(self, problem, format, from_format=None):
2001
def __init__(self, problem, format):
2140
2002
BzrError.__init__(self)
2141
2003
self.problem = problem
2142
2004
self.format = format
2143
self.from_format = from_format or '(unspecified)'
2146
2007
class NoDiffFound(BzrError):
2223
2084
class OutOfDateTree(BzrError):
2225
_fmt = "Working tree is out of date, please run 'bzr update'.%(more)s"
2086
_fmt = "Working tree is out of date, please run 'bzr update'."
2227
def __init__(self, tree, more=None):
2088
def __init__(self, tree):
2232
2089
BzrError.__init__(self)
2233
2090
self.tree = tree
2237
2093
class PublicBranchOutOfDate(BzrError):
2291
2147
self.reason = reason
2294
class InconsistentDeltaDelta(InconsistentDelta):
2295
"""Used when we get a delta that is not valid."""
2297
_fmt = ("An inconsistent delta was supplied: %(delta)r"
2298
"\nreason: %(reason)s")
2300
def __init__(self, delta, reason):
2301
BzrError.__init__(self)
2303
self.reason = reason
2306
2150
class UpgradeRequired(BzrError):
2308
2152
_fmt = "To use this feature you must upgrade your branch at %(path)s."
2317
2161
_fmt = "To use this feature you must upgrade your repository at %(path)s."
2320
class RichRootUpgradeRequired(UpgradeRequired):
2322
_fmt = ("To use this feature you must upgrade your branch at %(path)s to"
2323
" a format which supports rich roots.")
2326
2164
class LocalRequiresBoundBranch(BzrError):
2328
2166
_fmt = "Cannot perform local-only commits on unbound branches."
2169
class InvalidProgressBarType(BzrError):
2171
_fmt = ("Environment variable BZR_PROGRESS_BAR='%(bar_type)s"
2172
" is not a supported type Select one of: %(valid_types)s")
2174
def __init__(self, bar_type, valid_types):
2175
BzrError.__init__(self, bar_type=bar_type, valid_types=valid_types)
2331
2178
class UnsupportedOperation(BzrError):
2333
2180
_fmt = ("The method %(mname)s is not supported on"
2718
2565
This is distinct from ErrorFromSmartServer so that it is possible to
2719
2566
distinguish between the following two cases:
2721
- ErrorFromSmartServer was uncaught. This is logic error in the client
2722
and so should provoke a traceback to the user.
2723
- ErrorFromSmartServer was caught but its error_tuple could not be
2724
translated. This is probably because the server sent us garbage, and
2725
should not provoke a traceback.
2567
- ErrorFromSmartServer was uncaught. This is logic error in the client
2568
and so should provoke a traceback to the user.
2569
- ErrorFromSmartServer was caught but its error_tuple could not be
2570
translated. This is probably because the server sent us garbage, and
2571
should not provoke a traceback.
2728
2574
_fmt = "Server sent an unexpected error: %(error_tuple)r"
2855
2701
def __init__(self, bzrdir):
2856
2702
import bzrlib.urlutils as urlutils
2857
display_url = urlutils.unescape_for_display(bzrdir.user_url,
2703
display_url = urlutils.unescape_for_display(bzrdir.root_transport.base,
2859
2705
BzrError.__init__(self, bzrdir=bzrdir, display_url=display_url)
2926
2772
class UncommittedChanges(BzrError):
2928
_fmt = ('Working tree "%(display_url)s" has uncommitted changes'
2929
' (See bzr status).%(more)s')
2774
_fmt = 'Working tree "%(display_url)s" has uncommitted changes.'
2931
def __init__(self, tree, more=None):
2776
def __init__(self, tree):
2936
2777
import bzrlib.urlutils as urlutils
2937
user_url = getattr(tree, "user_url", None)
2938
if user_url is None:
2939
display_url = str(tree)
2941
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2942
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2945
class ShelvedChanges(UncommittedChanges):
2947
_fmt = ('Working tree "%(display_url)s" has shelved changes'
2948
' (See bzr shelve --list).%(more)s')
2778
display_url = urlutils.unescape_for_display(
2779
tree.bzrdir.root_transport.base, 'ascii')
2780
BzrError.__init__(self, tree=tree, display_url=display_url)
2951
2783
class MissingTemplateVariable(BzrError):
3022
2854
self.user_encoding = osutils.get_user_encoding()
3025
class NoSuchConfig(BzrError):
3027
_fmt = ('The "%(config_id)s" configuration does not exist.')
3029
def __init__(self, config_id):
3030
BzrError.__init__(self, config_id=config_id)
3033
class NoSuchConfigOption(BzrError):
3035
_fmt = ('The "%(option_name)s" configuration option does not exist.')
3037
def __init__(self, option_name):
3038
BzrError.__init__(self, option_name=option_name)
3041
2857
class NoSuchAlias(BzrError):
3043
2859
_fmt = ('The alias "%(alias_name)s" does not exist.')
3073
2889
_fmt = 'Cannot bind address "%(host)s:%(port)i": %(orig_error)s.'
3075
2891
def __init__(self, host, port, orig_error):
3076
# nb: in python2.4 socket.error doesn't have a useful repr
3077
2892
BzrError.__init__(self, host=host, port=port,
3078
orig_error=repr(orig_error.args))
2893
orig_error=orig_error[1])
3081
2896
class UnknownRules(BzrError):
3089
2904
class HookFailed(BzrError):
3090
2905
"""Raised when a pre_change_branch_tip hook function fails anything other
3091
2906
than TipChangeRejected.
3093
Note that this exception is no longer raised, and the import is only left
3094
to be nice to code which might catch it in a plugin.
3097
2909
_fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
3098
2910
"%(traceback_text)s%(exc_value)s")
3100
def __init__(self, hook_stage, hook_name, exc_info, warn=True):
3102
symbol_versioning.warn("BzrError HookFailed has been deprecated "
3103
"as of bzrlib 2.1.", DeprecationWarning, stacklevel=2)
2912
def __init__(self, hook_stage, hook_name, exc_info):
3104
2913
import traceback
3105
2914
self.hook_stage = hook_stage
3106
2915
self.hook_name = hook_name
3127
2936
_fmt = "Shelf corrupt."
3130
class DecompressCorruption(BzrError):
3132
_fmt = "Corruption while decompressing repository file%(orig_error)s"
3134
def __init__(self, orig_error=None):
3135
if orig_error is not None:
3136
self.orig_error = ", %s" % (orig_error,)
3138
self.orig_error = ""
3139
BzrError.__init__(self)
3142
2939
class NoSuchShelfId(BzrError):
3144
2941
_fmt = 'No changes are shelved with id "%(shelf_id)d".'
3240
3037
def __init__(self, source_branch, target_branch):
3241
3038
self.source_branch = source_branch
3242
3039
self.target_branch = target_branch
3245
class NoRoundtrippingSupport(BzrError):
3247
_fmt = ("Roundtripping is not supported between %(source_branch)r and "
3248
"%(target_branch)r.")
3250
internal_error = True
3252
def __init__(self, source_branch, target_branch):
3253
self.source_branch = source_branch
3254
self.target_branch = target_branch
3257
class FileTimestampUnavailable(BzrError):
3259
_fmt = "The filestamp for %(path)s is not available."
3261
internal_error = True
3263
def __init__(self, path):
3267
class NoColocatedBranchSupport(BzrError):
3269
_fmt = ("%(bzrdir)r does not support co-located branches.")
3271
def __init__(self, bzrdir):
3272
self.bzrdir = bzrdir
3275
class NoWhoami(BzrError):
3277
_fmt = ('Unable to determine your name.\n'
3278
"Please, set your name with the 'whoami' command.\n"
3279
'E.g. bzr whoami "Your Name <name@example.com>"')
3282
class InvalidPattern(BzrError):
3284
_fmt = ('Invalid pattern(s) found. %(msg)s')
3286
def __init__(self, msg):
3290
class RecursiveBind(BzrError):
3292
_fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
3293
'Please use `bzr unbind` to fix.')
3295
def __init__(self, branch_url):
3296
self.branch_url = branch_url
3299
# FIXME: I would prefer to define the config related exception classes in
3300
# config.py but the lazy import mechanism proscribes this -- vila 20101222
3301
class OptionExpansionLoop(BzrError):
3303
_fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
3305
def __init__(self, string, refs):
3306
self.string = string
3307
self.refs = '->'.join(refs)
3310
class ExpandingUnknownOption(BzrError):
3312
_fmt = 'Option %(name)s is not defined while expanding "%(string)s".'
3314
def __init__(self, name, string):
3316
self.string = string
3319
class NoCompatibleInter(BzrError):
3321
_fmt = ('No compatible object available for operations from %(source)r '
3324
def __init__(self, source, target):
3325
self.source = source
3326
self.target = target