691
649
# TODO: This is given a URL; we try to unescape it but doing that from inside
692
650
# the exception object is a bit undesirable.
693
# TODO: Probably this behavior of should be a common superclass
651
# TODO: Probably this behavior of should be a common superclass
694
652
class NotBranchError(PathError):
696
_fmt = 'Not a branch: "%(path)s".'
654
_fmt = 'Not a branch: "%(path)s"%(detail)s.'
698
def __init__(self, path):
656
def __init__(self, path, detail=None, bzrdir=None):
699
657
import bzrlib.urlutils as urlutils
700
self.path = urlutils.unescape_for_display(path, 'ascii')
658
path = urlutils.unescape_for_display(path, 'ascii')
659
if detail is not None:
660
detail = ': ' + detail
663
PathError.__init__(self, path=path)
666
return '<%s %r>' % (self.__class__.__name__, self.__dict__)
669
# XXX: Ideally self.detail would be a property, but Exceptions in
670
# Python 2.4 have to be old-style classes so properties don't work.
671
# Instead we override _format.
672
if self.detail is None:
673
if self.bzrdir is not None:
675
self.bzrdir.open_repository()
676
except NoRepositoryPresent:
679
# Just ignore unexpected errors. Raising arbitrary errors
680
# during str(err) can provoke strange bugs. Concretely
681
# Launchpad's codehosting managed to raise NotBranchError
682
# here, and then get stuck in an infinite loop/recursion
683
# trying to str() that error. All this error really cares
684
# about that there's no working repository there, and if
685
# open_repository() fails, there probably isn't.
688
self.detail = ': location is a repository'
691
return PathError._format(self)
703
694
class NoSubmitBranch(PathError):
1486
1498
self.options = options
1501
class RetryWithNewPacks(BzrError):
1502
"""Raised when we realize that the packs on disk have changed.
1504
This is meant as more of a signaling exception, to trap between where a
1505
local error occurred and the code that can actually handle the error and
1506
code that can retry appropriately.
1509
internal_error = True
1511
_fmt = ("Pack files have changed, reload and retry. context: %(context)s"
1514
def __init__(self, context, reload_occurred, exc_info):
1515
"""create a new RetryWithNewPacks error.
1517
:param reload_occurred: Set to True if we know that the packs have
1518
already been reloaded, and we are failing because of an in-memory
1519
cache miss. If set to True then we will ignore if a reload says
1520
nothing has changed, because we assume it has already reloaded. If
1521
False, then a reload with nothing changed will force an error.
1522
:param exc_info: The original exception traceback, so if there is a
1523
problem we can raise the original error (value from sys.exc_info())
1525
BzrError.__init__(self)
1526
self.context = context
1527
self.reload_occurred = reload_occurred
1528
self.exc_info = exc_info
1529
self.orig_error = exc_info[1]
1530
# TODO: The global error handler should probably treat this by
1531
# raising/printing the original exception with a bit about
1532
# RetryWithNewPacks also not being caught
1535
class RetryAutopack(RetryWithNewPacks):
1536
"""Raised when we are autopacking and we find a missing file.
1538
Meant as a signaling exception, to tell the autopack code it should try
1542
internal_error = True
1544
_fmt = ("Pack files have changed, reload and try autopack again."
1545
" context: %(context)s %(orig_error)s")
1489
1548
class NoSuchExportFormat(BzrError):
1491
1550
_fmt = "Export format %(format)r not supported"
1493
1552
def __init__(self, format):
1630
1722
_fmt = '%(source)s is%(permanently)s redirected to %(target)s'
1632
def __init__(self, source, target, is_permanent=False, qual_proto=None):
1724
def __init__(self, source, target, is_permanent=False):
1633
1725
self.source = source
1634
1726
self.target = target
1635
1727
if is_permanent:
1636
1728
self.permanently = ' permanently'
1638
1730
self.permanently = ''
1639
self._qualified_proto = qual_proto
1640
1731
TransportError.__init__(self)
1642
def _requalify_url(self, url):
1643
"""Restore the qualified proto in front of the url"""
1644
# When this exception is raised, source and target are in
1645
# user readable format. But some transports may use a
1646
# different proto (http+urllib:// will present http:// to
1647
# the user. If a qualified proto is specified, the code
1648
# trapping the exception can get the qualified urls to
1649
# properly handle the redirection themself (creating a
1650
# new transport object from the target url for example).
1651
# But checking that the scheme of the original and
1652
# redirected urls are the same can be tricky. (see the
1653
# FIXME in BzrDir.open_from_transport for the unique use
1655
if self._qualified_proto is None:
1658
# The TODO related to NotBranchError mention that doing
1659
# that kind of manipulation on the urls may not be the
1660
# exception object job. On the other hand, this object is
1661
# the interface between the code and the user so
1662
# presenting the urls in different ways is indeed its
1665
proto, netloc, path, query, fragment = urlparse.urlsplit(url)
1666
return urlparse.urlunsplit((self._qualified_proto, netloc, path,
1669
def get_source_url(self):
1670
return self._requalify_url(self.source)
1672
def get_target_url(self):
1673
return self._requalify_url(self.target)
1676
1734
class TooManyRedirections(TransportError):
2745
2869
class UncommittedChanges(BzrError):
2747
_fmt = 'Working tree "%(display_url)s" has uncommitted changes.'
2749
def __init__(self, tree):
2750
import bzrlib.urlutils as urlutils
2751
display_url = urlutils.unescape_for_display(
2752
tree.bzrdir.root_transport.base, 'ascii')
2753
BzrError.__init__(self, tree=tree, display_url=display_url)
2871
_fmt = ('Working tree "%(display_url)s" has uncommitted changes'
2872
' (See bzr status).%(more)s')
2874
def __init__(self, tree, more=None):
2879
import bzrlib.urlutils as urlutils
2880
user_url = getattr(tree, "user_url", None)
2881
if user_url is None:
2882
display_url = str(tree)
2884
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2885
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2888
class StoringUncommittedNotSupported(BzrError):
2890
_fmt = ('Branch "%(display_url)s" does not support storing uncommitted'
2893
def __init__(self, branch):
2894
import bzrlib.urlutils as urlutils
2895
user_url = getattr(branch, "user_url", None)
2896
if user_url is None:
2897
display_url = str(branch)
2899
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2900
BzrError.__init__(self, branch=branch, display_url=display_url)
2903
class ShelvedChanges(UncommittedChanges):
2905
_fmt = ('Working tree "%(display_url)s" has shelved changes'
2906
' (See bzr shelve --list).%(more)s')
2756
2909
class MissingTemplateVariable(BzrError):
2879
3044
BzrError.__init__(self, unknowns_str=", ".join(unknowns))
2882
class HookFailed(BzrError):
2883
"""Raised when a pre_change_branch_tip hook function fails anything other
2884
than TipChangeRejected.
2887
_fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
2888
"%(traceback_text)s%(exc_value)s")
2890
def __init__(self, hook_stage, hook_name, exc_info):
2892
self.hook_stage = hook_stage
2893
self.hook_name = hook_name
2894
self.exc_info = exc_info
2895
self.exc_type = exc_info[0]
2896
self.exc_value = exc_info[1]
2897
self.exc_tb = exc_info[2]
2898
self.traceback_text = ''.join(traceback.format_tb(self.exc_tb))
2901
3047
class TipChangeRejected(BzrError):
2902
3048
"""A pre_change_branch_tip hook function may raise this to cleanly and
2903
3049
explicitly abort a change to a branch tip.
2906
3052
_fmt = u"Tip change rejected: %(msg)s"
2908
3054
def __init__(self, msg):
3058
class ShelfCorrupt(BzrError):
3060
_fmt = "Shelf corrupt."
3063
class DecompressCorruption(BzrError):
3065
_fmt = "Corruption while decompressing repository file%(orig_error)s"
3067
def __init__(self, orig_error=None):
3068
if orig_error is not None:
3069
self.orig_error = ", %s" % (orig_error,)
3071
self.orig_error = ""
3072
BzrError.__init__(self)
3075
class NoSuchShelfId(BzrError):
3077
_fmt = 'No changes are shelved with id "%(shelf_id)d".'
3079
def __init__(self, shelf_id):
3080
BzrError.__init__(self, shelf_id=shelf_id)
3083
class InvalidShelfId(BzrError):
3085
_fmt = '"%(invalid_id)s" is not a valid shelf id, try a number instead.'
3087
def __init__(self, invalid_id):
3088
BzrError.__init__(self, invalid_id=invalid_id)
3091
class JailBreak(BzrError):
3093
_fmt = "An attempt to access a url outside the server jail was made: '%(url)s'."
3095
def __init__(self, url):
3096
BzrError.__init__(self, url=url)
3099
class UserAbort(BzrError):
3101
_fmt = 'The user aborted the operation.'
3104
class MustHaveWorkingTree(BzrError):
3106
_fmt = ("Branching '%(url)s'(%(format)s) must create a working tree.")
3108
def __init__(self, format, url):
3109
BzrError.__init__(self, format=format, url=url)
3112
class NoSuchView(BzrError):
3113
"""A view does not exist.
3116
_fmt = u"No such view: %(view_name)s."
3118
def __init__(self, view_name):
3119
self.view_name = view_name
3122
class ViewsNotSupported(BzrError):
3123
"""Views are not supported by a tree format.
3126
_fmt = ("Views are not supported by %(tree)s;"
3127
" use 'bzr upgrade' to change your tree to a later format.")
3129
def __init__(self, tree):
3133
class FileOutsideView(BzrError):
3135
_fmt = ('Specified file "%(file_name)s" is outside the current view: '
3138
def __init__(self, file_name, view_files):
3139
self.file_name = file_name
3140
self.view_str = ", ".join(view_files)
3143
class UnresumableWriteGroup(BzrError):
3145
_fmt = ("Repository %(repository)s cannot resume write group "
3146
"%(write_groups)r: %(reason)s")
3148
internal_error = True
3150
def __init__(self, repository, write_groups, reason):
3151
self.repository = repository
3152
self.write_groups = write_groups
3153
self.reason = reason
3156
class UnsuspendableWriteGroup(BzrError):
3158
_fmt = ("Repository %(repository)s cannot suspend a write group.")
3160
internal_error = True
3162
def __init__(self, repository):
3163
self.repository = repository
3166
class LossyPushToSameVCS(BzrError):
3168
_fmt = ("Lossy push not possible between %(source_branch)r and "
3169
"%(target_branch)r that are in the same VCS.")
3171
internal_error = True
3173
def __init__(self, source_branch, target_branch):
3174
self.source_branch = source_branch
3175
self.target_branch = target_branch
3178
class NoRoundtrippingSupport(BzrError):
3180
_fmt = ("Roundtripping is not supported between %(source_branch)r and "
3181
"%(target_branch)r.")
3183
internal_error = True
3185
def __init__(self, source_branch, target_branch):
3186
self.source_branch = source_branch
3187
self.target_branch = target_branch
3190
class FileTimestampUnavailable(BzrError):
3192
_fmt = "The filestamp for %(path)s is not available."
3194
internal_error = True
3196
def __init__(self, path):
3200
class NoColocatedBranchSupport(BzrError):
3202
_fmt = ("%(bzrdir)r does not support co-located branches.")
3204
def __init__(self, bzrdir):
3205
self.bzrdir = bzrdir
3208
class NoWhoami(BzrError):
3210
_fmt = ('Unable to determine your name.\n'
3211
"Please, set your name with the 'whoami' command.\n"
3212
'E.g. bzr whoami "Your Name <name@example.com>"')
3215
class InvalidPattern(BzrError):
3217
_fmt = ('Invalid pattern(s) found. %(msg)s')
3219
def __init__(self, msg):
3223
class RecursiveBind(BzrError):
3225
_fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
3226
'Please use `bzr unbind` to fix.')
3228
def __init__(self, branch_url):
3229
self.branch_url = branch_url
3232
# FIXME: I would prefer to define the config related exception classes in
3233
# config.py but the lazy import mechanism proscribes this -- vila 20101222
3234
class OptionExpansionLoop(BzrError):
3236
_fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
3238
def __init__(self, string, refs):
3239
self.string = string
3240
self.refs = '->'.join(refs)
3243
class ExpandingUnknownOption(BzrError):
3245
_fmt = 'Option "%(name)s" is not defined while expanding "%(string)s".'
3247
def __init__(self, name, string):
3249
self.string = string
3252
class IllegalOptionName(BzrError):
3254
_fmt = 'Option "%(name)s" is not allowed.'
3256
def __init__(self, name):
3260
class NoCompatibleInter(BzrError):
3262
_fmt = ('No compatible object available for operations from %(source)r '
3265
def __init__(self, source, target):
3266
self.source = source
3267
self.target = target
3270
class HpssVfsRequestNotAllowed(BzrError):
3272
_fmt = ("VFS requests over the smart server are not allowed. Encountered: "
3273
"%(method)s, %(arguments)s.")
3275
def __init__(self, method, arguments):
3276
self.method = method
3277
self.arguments = arguments
3280
class UnsupportedKindChange(BzrError):
3282
_fmt = ("Kind change from %(from_kind)s to %(to_kind)s for "
3283
"%(path)s not supported by format %(format)r")
3285
def __init__(self, path, from_kind, to_kind, format):
3287
self.from_kind = from_kind
3288
self.to_kind = to_kind
3289
self.format = format
3292
class MissingFeature(BzrError):
3294
_fmt = ("Missing feature %(feature)s not provided by this "
3295
"version of Bazaar or any plugin.")
3297
def __init__(self, feature):
3298
self.feature = feature
3301
class PatchSyntax(BzrError):
3302
"""Base class for patch syntax errors."""
3305
class BinaryFiles(BzrError):
3307
_fmt = 'Binary files section encountered.'
3309
def __init__(self, orig_name, mod_name):
3310
self.orig_name = orig_name
3311
self.mod_name = mod_name
3314
class MalformedPatchHeader(PatchSyntax):
3316
_fmt = "Malformed patch header. %(desc)s\n%(line)r"
3318
def __init__(self, desc, line):
3323
class MalformedHunkHeader(PatchSyntax):
3325
_fmt = "Malformed hunk header. %(desc)s\n%(line)r"
3327
def __init__(self, desc, line):
3332
class MalformedLine(PatchSyntax):
3334
_fmt = "Malformed line. %(desc)s\n%(line)r"
3336
def __init__(self, desc, line):
3341
class PatchConflict(BzrError):
3343
_fmt = ('Text contents mismatch at line %(line_no)d. Original has '
3344
'"%(orig_line)s", but patch says it should be "%(patch_line)s"')
3346
def __init__(self, line_no, orig_line, patch_line):
3347
self.line_no = line_no
3348
self.orig_line = orig_line.rstrip('\n')
3349
self.patch_line = patch_line.rstrip('\n')
3352
class FeatureAlreadyRegistered(BzrError):
3354
_fmt = 'The feature %(feature)s has already been registered.'
3356
def __init__(self, feature):
3357
self.feature = feature
3360
class ChangesAlreadyStored(BzrCommandError):
3362
_fmt = ('Cannot store uncommitted changes because this branch already'
3363
' stores uncommitted changes.')