1
# Copyright (C) 2005, 2006, 2007, 2008 Canonical Ltd
1
# Copyright (C) 2005-2010 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
702
702
# TODO: Probably this behavior of should be a common superclass
703
703
class NotBranchError(PathError):
705
_fmt = 'Not a branch: "%(path)s".'
705
_fmt = 'Not a branch: "%(path)s"%(detail)s.'
707
def __init__(self, path):
707
def __init__(self, path, detail=None, bzrdir=None):
708
708
import bzrlib.urlutils as urlutils
709
self.path = urlutils.unescape_for_display(path, 'ascii')
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)
712
745
class NoSubmitBranch(PathError):
762
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)))
764
799
def __init__(self, branch, path):
765
800
BzrError.__init__(self)
766
801
self.branch = branch
926
961
# original exception is available as e.original_error
928
963
# New code should prefer to raise specific subclasses
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.
964
def __init__(self, msg):
936
968
class LockActive(LockError):
1054
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
1057
1099
class LockNotHeld(LockError):
1059
1101
_fmt = "Lock not held: %(lock)s"
1159
1201
class InvalidRevisionSpec(BzrError):
1161
_fmt = ("Requested revision: %(spec)r does not exist in branch:"
1162
" %(branch)s%(extra)s")
1203
_fmt = ("Requested revision: '%(spec)s' does not exist in branch:"
1204
" %(branch_url)s%(extra)s")
1164
1206
def __init__(self, spec, branch, extra=None):
1165
1207
BzrError.__init__(self, branch=branch, spec=spec)
1208
self.branch_url = getattr(branch, 'user_url', str(branch))
1167
1210
self.extra = '\n' + str(extra)
1247
1290
class AmbiguousBase(BzrError):
1249
1292
def __init__(self, bases):
1250
warn("BzrError AmbiguousBase has been deprecated as of bzrlib 0.8.",
1293
symbol_versioning.warn("BzrError AmbiguousBase has been deprecated "
1294
"as of bzrlib 0.8.", DeprecationWarning, stacklevel=2)
1252
1295
msg = ("The correct base is unclear, because %s are all equally close"
1253
1296
% ", ".join(bases))
1254
1297
BzrError.__init__(self, msg)
1276
1319
class BoundBranchOutOfDate(BzrError):
1278
1321
_fmt = ("Bound branch %(branch)s is out of date with master branch"
1322
" %(master)s.%(extra_help)s")
1281
1324
def __init__(self, branch, master):
1282
1325
BzrError.__init__(self)
1283
1326
self.branch = branch
1284
1327
self.master = master
1328
self.extra_help = ''
1287
1331
class CommitToDoubleBoundBranch(BzrError):
1359
1403
class WeaveParentMismatch(WeaveError):
1361
_fmt = "Parents are mismatched between two revisions. %(message)s"
1405
_fmt = "Parents are mismatched between two revisions. %(msg)s"
1364
1408
class WeaveInvalidChecksum(WeaveError):
1366
_fmt = "Text did not match it's checksum: %(message)s"
1410
_fmt = "Text did not match its checksum: %(msg)s"
1369
1413
class WeaveTextDiffers(WeaveError):
1903
1947
_fmt = "Moving the root directory is not supported at this time"
1950
class TransformRenameFailed(BzrError):
1952
_fmt = "Failed to rename %(from_path)s to %(to_path)s: %(why)s"
1954
def __init__(self, from_path, to_path, why, errno):
1955
self.from_path = from_path
1956
self.to_path = to_path
1906
1961
class BzrMoveFailedError(BzrError):
1908
1963
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
1953
2008
"Use --keep to not delete them, or --force to delete them regardless.")
1955
2010
def __init__(self, tree_delta):
2011
symbol_versioning.warn(symbol_versioning.deprecated_in((2, 3, 0)) %
2012
"BzrRemoveChangedFilesError", DeprecationWarning, stacklevel=2)
1956
2013
BzrError.__init__(self)
1957
2014
self.changes_as_text = tree_delta.get_changes_as_text()
1958
2015
#self.paths_as_string = '\n'.join(changed_files)
2155
2212
def __init__(self, repo):
2156
2213
BzrError.__init__(self)
2157
self.repo_path = repo.bzrdir.root_transport.base
2214
self.repo_path = repo.user_url
2160
2217
class InconsistentDelta(BzrError):
2733
2790
def __init__(self, bzrdir):
2734
2791
import bzrlib.urlutils as urlutils
2735
display_url = urlutils.unescape_for_display(bzrdir.root_transport.base,
2792
display_url = urlutils.unescape_for_display(bzrdir.user_url,
2737
2794
BzrError.__init__(self, bzrdir=bzrdir, display_url=display_url)
2813
2870
more = ' ' + more
2814
2871
import bzrlib.urlutils as urlutils
2815
display_url = urlutils.unescape_for_display(
2816
tree.bzrdir.root_transport.base, 'ascii')
2872
user_url = getattr(tree, "user_url", None)
2873
if user_url is None:
2874
display_url = str(tree)
2876
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2817
2877
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2880
class ShelvedChanges(UncommittedChanges):
2882
_fmt = ('Working tree "%(display_url)s" has shelved changes'
2883
' (See bzr shelve --list).%(more)s')
2820
2886
class MissingTemplateVariable(BzrError):
2822
2888
_fmt = 'Variable {%(name)s} is not available.'
2891
2957
self.user_encoding = osutils.get_user_encoding()
2960
class NoSuchConfig(BzrError):
2962
_fmt = ('The "%(config_id)s" configuration does not exist.')
2964
def __init__(self, config_id):
2965
BzrError.__init__(self, config_id=config_id)
2968
class NoSuchConfigOption(BzrError):
2970
_fmt = ('The "%(option_name)s" configuration option does not exist.')
2972
def __init__(self, option_name):
2973
BzrError.__init__(self, option_name=option_name)
2894
2976
class NoSuchAlias(BzrError):
2896
2978
_fmt = ('The alias "%(alias_name)s" does not exist.')
2942
3024
class HookFailed(BzrError):
2943
3025
"""Raised when a pre_change_branch_tip hook function fails anything other
2944
3026
than TipChangeRejected.
3028
Note that this exception is no longer raised, and the import is only left
3029
to be nice to code which might catch it in a plugin.
2947
3032
_fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
2948
3033
"%(traceback_text)s%(exc_value)s")
2950
def __init__(self, hook_stage, hook_name, exc_info):
3035
def __init__(self, hook_stage, hook_name, exc_info, warn=True):
3037
symbol_versioning.warn("BzrError HookFailed has been deprecated "
3038
"as of bzrlib 2.1.", DeprecationWarning, stacklevel=2)
2951
3039
import traceback
2952
3040
self.hook_stage = hook_stage
2953
3041
self.hook_name = hook_name
3075
3163
def __init__(self, source_branch, target_branch):
3076
3164
self.source_branch = source_branch
3077
3165
self.target_branch = target_branch
3168
class NoRoundtrippingSupport(BzrError):
3170
_fmt = ("Roundtripping is not supported between %(source_branch)r and "
3171
"%(target_branch)r.")
3173
internal_error = True
3175
def __init__(self, source_branch, target_branch):
3176
self.source_branch = source_branch
3177
self.target_branch = target_branch
3180
class FileTimestampUnavailable(BzrError):
3182
_fmt = "The filestamp for %(path)s is not available."
3184
internal_error = True
3186
def __init__(self, path):
3190
class NoColocatedBranchSupport(BzrError):
3192
_fmt = ("%(bzrdir)r does not support co-located branches.")
3194
def __init__(self, bzrdir):
3195
self.bzrdir = bzrdir
3198
class NoWhoami(BzrError):
3200
_fmt = ('Unable to determine your name.\n'
3201
"Please, set your name with the 'whoami' command.\n"
3202
'E.g. bzr whoami "Your Name <name@example.com>"')
3205
class InvalidPattern(BzrError):
3207
_fmt = ('Invalid pattern(s) found. %(msg)s')
3209
def __init__(self, msg):
3213
class RecursiveBind(BzrError):
3215
_fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
3216
'Please use `bzr unbind` to fix.')
3218
def __init__(self, branch_url):
3219
self.branch_url = branch_url