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
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" \
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):
1956
1887
_fmt = "Moving the root directory is not supported at this time"
1959
class TransformRenameFailed(BzrError):
1961
_fmt = "Failed to rename %(from_path)s to %(to_path)s: %(why)s"
1963
def __init__(self, from_path, to_path, why, errno):
1964
self.from_path = from_path
1965
self.to_path = to_path
1970
1890
class BzrMoveFailedError(BzrError):
1972
_fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
1973
"%(_has_extra)s%(extra)s")
1892
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
1975
1894
def __init__(self, from_path='', to_path='', extra=None):
1976
1895
from bzrlib.osutils import splitpath
1977
1896
BzrError.__init__(self)
1979
self.extra, self._has_extra = extra, ': '
1898
self.extra = ': ' + str(extra)
1981
self.extra = self._has_extra = ''
1983
1902
has_from = len(from_path) > 0
1984
1903
has_to = len(to_path) > 0
2006
1925
class BzrRenameFailedError(BzrMoveFailedError):
2008
_fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
2009
"%(_has_extra)s%(extra)s")
1927
_fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
2011
1929
def __init__(self, from_path, to_path, extra=None):
2012
1930
BzrMoveFailedError.__init__(self, from_path, to_path, extra)
2015
1932
class BzrRemoveChangedFilesError(BzrError):
2016
1933
"""Used when user is trying to remove changed files."""
2020
1937
"Use --keep to not delete them, or --force to delete them regardless.")
2022
1939
def __init__(self, tree_delta):
2023
symbol_versioning.warn(symbol_versioning.deprecated_in((2, 3, 0)) %
2024
"BzrRemoveChangedFilesError", DeprecationWarning, stacklevel=2)
2025
1940
BzrError.__init__(self)
2026
1941
self.changes_as_text = tree_delta.get_changes_as_text()
2027
1942
#self.paths_as_string = '\n'.join(changed_files)
2082
1997
class BadConversionTarget(BzrError):
2084
_fmt = "Cannot convert from format %(from_format)s to format %(format)s." \
1999
_fmt = "Cannot convert to format %(format)s. %(problem)s"
2087
def __init__(self, problem, format, from_format=None):
2001
def __init__(self, problem, format):
2088
2002
BzrError.__init__(self)
2089
2003
self.problem = problem
2090
2004
self.format = format
2091
self.from_format = from_format or '(unspecified)'
2094
2007
class NoDiffFound(BzrError):
2171
2084
class OutOfDateTree(BzrError):
2173
_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'."
2175
def __init__(self, tree, more=None):
2088
def __init__(self, tree):
2180
2089
BzrError.__init__(self)
2181
2090
self.tree = tree
2185
2093
class PublicBranchOutOfDate(BzrError):
2239
2147
self.reason = reason
2242
class InconsistentDeltaDelta(InconsistentDelta):
2243
"""Used when we get a delta that is not valid."""
2245
_fmt = ("An inconsistent delta was supplied: %(delta)r"
2246
"\nreason: %(reason)s")
2248
def __init__(self, delta, reason):
2249
BzrError.__init__(self)
2251
self.reason = reason
2254
2150
class UpgradeRequired(BzrError):
2256
2152
_fmt = "To use this feature you must upgrade your branch at %(path)s."
2802
2698
def __init__(self, bzrdir):
2803
2699
import bzrlib.urlutils as urlutils
2804
display_url = urlutils.unescape_for_display(bzrdir.user_url,
2700
display_url = urlutils.unescape_for_display(bzrdir.root_transport.base,
2806
2702
BzrError.__init__(self, bzrdir=bzrdir, display_url=display_url)
2873
2769
class UncommittedChanges(BzrError):
2875
_fmt = ('Working tree "%(display_url)s" has uncommitted changes'
2876
' (See bzr status).%(more)s')
2771
_fmt = 'Working tree "%(display_url)s" has uncommitted changes.'
2878
def __init__(self, tree, more=None):
2773
def __init__(self, tree):
2883
2774
import bzrlib.urlutils as urlutils
2884
user_url = getattr(tree, "user_url", None)
2885
if user_url is None:
2886
display_url = str(tree)
2888
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2889
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2892
class ShelvedChanges(UncommittedChanges):
2894
_fmt = ('Working tree "%(display_url)s" has shelved changes'
2895
' (See bzr shelve --list).%(more)s')
2775
display_url = urlutils.unescape_for_display(
2776
tree.bzrdir.root_transport.base, 'ascii')
2777
BzrError.__init__(self, tree=tree, display_url=display_url)
2898
2780
class MissingTemplateVariable(BzrError):
2969
2851
self.user_encoding = osutils.get_user_encoding()
2972
class NoSuchConfig(BzrError):
2974
_fmt = ('The "%(config_id)s" configuration does not exist.')
2976
def __init__(self, config_id):
2977
BzrError.__init__(self, config_id=config_id)
2980
class NoSuchConfigOption(BzrError):
2982
_fmt = ('The "%(option_name)s" configuration option does not exist.')
2984
def __init__(self, option_name):
2985
BzrError.__init__(self, option_name=option_name)
2988
2854
class NoSuchAlias(BzrError):
2990
2856
_fmt = ('The alias "%(alias_name)s" does not exist.')
3020
2886
_fmt = 'Cannot bind address "%(host)s:%(port)i": %(orig_error)s.'
3022
2888
def __init__(self, host, port, orig_error):
3023
# nb: in python2.4 socket.error doesn't have a useful repr
3024
2889
BzrError.__init__(self, host=host, port=port,
3025
orig_error=repr(orig_error.args))
2890
orig_error=orig_error[1])
3028
2893
class UnknownRules(BzrError):
3036
2901
class HookFailed(BzrError):
3037
2902
"""Raised when a pre_change_branch_tip hook function fails anything other
3038
2903
than TipChangeRejected.
3040
Note that this exception is no longer raised, and the import is only left
3041
to be nice to code which might catch it in a plugin.
3044
2906
_fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
3045
2907
"%(traceback_text)s%(exc_value)s")
3047
def __init__(self, hook_stage, hook_name, exc_info, warn=True):
3049
symbol_versioning.warn("BzrError HookFailed has been deprecated "
3050
"as of bzrlib 2.1.", DeprecationWarning, stacklevel=2)
2909
def __init__(self, hook_stage, hook_name, exc_info):
3051
2910
import traceback
3052
2911
self.hook_stage = hook_stage
3053
2912
self.hook_name = hook_name
3175
3034
def __init__(self, source_branch, target_branch):
3176
3035
self.source_branch = source_branch
3177
3036
self.target_branch = target_branch
3180
class NoRoundtrippingSupport(BzrError):
3182
_fmt = ("Roundtripping is not supported between %(source_branch)r and "
3183
"%(target_branch)r.")
3185
internal_error = True
3187
def __init__(self, source_branch, target_branch):
3188
self.source_branch = source_branch
3189
self.target_branch = target_branch
3192
class FileTimestampUnavailable(BzrError):
3194
_fmt = "The filestamp for %(path)s is not available."
3196
internal_error = True
3198
def __init__(self, path):
3202
class NoColocatedBranchSupport(BzrError):
3204
_fmt = ("%(bzrdir)r does not support co-located branches.")
3206
def __init__(self, bzrdir):
3207
self.bzrdir = bzrdir
3210
class NoWhoami(BzrError):
3212
_fmt = ('Unable to determine your name.\n'
3213
"Please, set your name with the 'whoami' command.\n"
3214
'E.g. bzr whoami "Your Name <name@example.com>"')
3217
class InvalidPattern(BzrError):
3219
_fmt = ('Invalid pattern(s) found. %(msg)s')
3221
def __init__(self, msg):
3225
class RecursiveBind(BzrError):
3227
_fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
3228
'Please use `bzr unbind` to fix.')
3230
def __init__(self, branch_url):
3231
self.branch_url = branch_url
3234
# FIXME: I would prefer to define the config related exception classes in
3235
# config.py but the lazy import mechanism proscribes this -- vila 20101222
3236
class OptionExpansionLoop(BzrError):
3238
_fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
3240
def __init__(self, string, refs):
3241
self.string = string
3242
self.refs = '->'.join(refs)
3245
class ExpandingUnknownOption(BzrError):
3247
_fmt = 'Option %(name)s is not defined while expanding "%(string)s".'
3249
def __init__(self, name, string):
3251
self.string = string