46
# return codes from the bzr program
39
# return codes from the brz program
49
42
EXIT_INTERNAL_ERROR = 4
52
class BzrError(StandardError):
45
class BzrError(Exception):
54
Base class for errors raised by bzrlib.
47
Base class for errors raised by breezy.
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 details.
59
(That can be overridden by -Derror on the command line.)
49
:cvar internal_error: if True this was probably caused by a brz bug and
50
should be displayed with a traceback; if False (or absent) this was
51
probably a user or environment error and they don't need the gory
52
details. (That can be overridden by -Derror on the command line.)
61
54
:cvar _fmt: Format string to display the error; this is expanded
62
by the instance's dict.
55
by the instance's dict.
65
58
internal_error = False
106
100
# __str__() should always return a 'str' object
107
101
# never a 'unicode' object.
109
except (AttributeError, TypeError, NameError, ValueError, KeyError), e:
110
return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
111
% (self.__class__.__name__,
113
getattr(self, '_fmt', None),
116
def __unicode__(self):
118
if isinstance(u, str):
119
# Try decoding the str using the default encoding.
121
elif not isinstance(u, unicode):
122
# Try to make a unicode object from it, because __unicode__ must
123
# return a unicode object.
129
if isinstance(s, unicode):
132
# __str__ must return a str.
103
except Exception as e:
105
return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
106
% (self.__class__.__name__,
108
getattr(self, '_fmt', None),
115
return self._format().encode('utf-8')
117
__unicode__ = _format
136
119
def __repr__(self):
137
120
return '%s(%s)' % (self.__class__.__name__, str(self))
140
123
"""Return format string for this exception or None"""
141
124
fmt = getattr(self, '_fmt', None)
142
125
if fmt is not None:
144
fmt = getattr(self, '__doc__', None)
146
symbol_versioning.warn("%s uses its docstring as a format, "
147
"it should use _fmt instead" % self.__class__.__name__,
150
return 'Unprintable exception %s: dict=%r, fmt=%r' \
151
% (self.__class__.__name__,
153
getattr(self, '_fmt', None),
126
from breezy.i18n import gettext
127
return gettext(fmt) # _fmt strings should be ascii
156
129
def __eq__(self, other):
157
130
if self.__class__ is not other.__class__:
158
131
return NotImplemented
159
132
return self.__dict__ == other.__dict__
162
138
class InternalBzrError(BzrError):
163
139
"""Base class for errors that are internal in nature.
170
146
internal_error = True
173
class BzrNewError(BzrError):
174
"""Deprecated error base class."""
175
# base classes should override the docstring with their human-
176
# readable explanation
178
def __init__(self, *args, **kwds):
179
# XXX: Use the underlying BzrError to always generate the args
180
# attribute if it doesn't exist. We can't use super here, because
181
# exceptions are old-style classes in python2.4 (but new in 2.5).
183
symbol_versioning.warn('BzrNewError was deprecated in bzr 0.13; '
184
'please convert %s to use BzrError instead'
185
% self.__class__.__name__,
188
BzrError.__init__(self, *args)
189
for key, value in kwds.items():
190
setattr(self, key, value)
194
# __str__() should always return a 'str' object
195
# never a 'unicode' object.
196
s = self.__doc__ % self.__dict__
197
if isinstance(s, unicode):
198
return s.encode('utf8')
200
except (TypeError, NameError, ValueError, KeyError), e:
201
return 'Unprintable exception %s(%r): %r' \
202
% (self.__class__.__name__,
206
149
class AlreadyBuilding(BzrError):
208
151
_fmt = "The tree builder is already building a tree."
705
647
_fmt = 'Not a branch: "%(path)s"%(detail)s.'
707
def __init__(self, path, detail=None, bzrdir=None):
708
import bzrlib.urlutils as urlutils
649
def __init__(self, path, detail=None, controldir=None):
650
from . import urlutils
709
651
path = urlutils.unescape_for_display(path, 'ascii')
710
652
if detail is not None:
711
653
detail = ': ' + detail
712
654
self.detail = detail
655
self.controldir = controldir
714
656
PathError.__init__(self, path=path)
717
# XXX: Ideally self.detail would be a property, but Exceptions in
718
# Python 2.4 have to be old-style classes so properties don't work.
719
# Instead we override _format.
659
return '<%s %r>' % (self.__class__.__name__, self.__dict__)
661
def _get_format_string(self):
662
# GZ 2017-06-08: Not the best place to lazy fill detail in.
720
663
if self.detail is None:
721
if self.bzrdir is not None:
723
self.bzrdir.open_repository()
724
except NoRepositoryPresent:
727
self.detail = ': location is a repository'
664
self.detail = self._get_detail()
665
return super(NotBranchError, self)._get_format_string()
667
def _get_detail(self):
668
if self.controldir is not None:
670
self.controldir.open_repository()
671
except NoRepositoryPresent:
673
except Exception as e:
674
# Just ignore unexpected errors. Raising arbitrary errors
675
# during str(err) can provoke strange bugs. Concretely
676
# Launchpad's codehosting managed to raise NotBranchError
677
# here, and then get stuck in an infinite loop/recursion
678
# trying to str() that error. All this error really cares
679
# about that there's no working repository there, and if
680
# open_repository() fails, there probably isn't.
681
return ': ' + e.__class__.__name__
730
return PathError._format(self)
683
return ': location is a repository'
733
687
class NoSubmitBranch(PathError):
735
689
_fmt = 'No submit branch available for branch "%(path)s"'
737
691
def __init__(self, branch):
738
import bzrlib.urlutils as urlutils
692
from . import urlutils
739
693
self.path = urlutils.unescape_for_display(branch.base, 'ascii')
696
class AlreadyControlDirError(PathError):
698
_fmt = 'A control directory already exists: "%(path)s".'
742
701
class AlreadyBranchError(PathError):
744
703
_fmt = 'Already a branch: "%(path)s".'
706
class InvalidBranchName(PathError):
708
_fmt = "Invalid branch name: %(name)s"
710
def __init__(self, name):
711
BzrError.__init__(self)
715
class ParentBranchExists(AlreadyBranchError):
717
_fmt = 'Parent branch already exists: "%(path)s".'
747
720
class BranchExistsWithoutWorkingTree(PathError):
749
722
_fmt = 'Directory contains a branch, but no working tree \
750
(use bzr checkout if you wish to build a working tree): "%(path)s"'
723
(use brz checkout if you wish to build a working tree): "%(path)s"'
753
726
class AtomicFileAlreadyClosed(PathError):
773
746
class NoRepositoryPresent(BzrError):
775
748
_fmt = 'No repository present: "%(path)s"'
776
def __init__(self, bzrdir):
777
BzrError.__init__(self)
778
self.path = bzrdir.transport.clone('..').base
781
class FileInWrongBranch(BzrError):
783
_fmt = 'File "%(path)s" is not in branch %(branch_base)s.'
785
def __init__(self, branch, path):
786
BzrError.__init__(self)
788
self.branch_base = branch.base
749
def __init__(self, controldir):
750
BzrError.__init__(self)
751
self.path = controldir.transport.clone('..').base
792
754
class UnsupportedFormatError(BzrError):
794
_fmt = "Unsupported branch format: %(format)s\nPlease run 'bzr upgrade'"
756
_fmt = "Unsupported branch format: %(format)s\nPlease run 'brz upgrade'"
797
759
class UnknownFormatError(BzrError):
806
768
class IncompatibleFormat(BzrError):
808
_fmt = "Format %(format)s is not compatible with .bzr version %(bzrdir)s."
810
def __init__(self, format, bzrdir_format):
811
BzrError.__init__(self)
813
self.bzrdir = bzrdir_format
770
_fmt = "Format %(format)s is not compatible with .bzr version %(controldir)s."
772
def __init__(self, format, controldir_format):
773
BzrError.__init__(self)
775
self.controldir = controldir_format
778
class ParseFormatError(BzrError):
780
_fmt = "Parse error on line %(lineno)d of %(format)s format: %(line)s"
782
def __init__(self, format, lineno, line, text):
783
BzrError.__init__(self)
816
790
class IncompatibleRepositories(BzrError):
1180
1170
class InvalidRevisionSpec(BzrError):
1182
1172
_fmt = ("Requested revision: '%(spec)s' does not exist in branch:"
1183
" %(branch)s%(extra)s")
1173
" %(branch_url)s%(extra)s")
1185
1175
def __init__(self, spec, branch, extra=None):
1186
1176
BzrError.__init__(self, branch=branch, spec=spec)
1177
self.branch_url = getattr(branch, 'user_url', str(branch))
1188
1179
self.extra = '\n' + str(extra)
1190
1181
self.extra = ''
1193
class HistoryMissing(BzrError):
1195
_fmt = "%(branch)s is missing %(object_type)s {%(object_id)s}"
1198
1184
class AppendRevisionsOnlyViolation(BzrError):
1200
1186
_fmt = ('Operation denied because it would change the main history,'
1733
1734
_fmt = "Working tree has conflicts."
1737
class ConfigContentError(BzrError):
1739
_fmt = "Config file %(filename)s is not UTF-8 encoded\n"
1741
def __init__(self, filename):
1742
BzrError.__init__(self)
1743
self.filename = filename
1736
1746
class ParseConfigError(BzrError):
1748
_fmt = "Error(s) parsing config file %(filename)s:\n%(errors)s"
1738
1750
def __init__(self, errors, filename):
1739
if filename is None:
1741
message = "Error(s) parsing config file %s:\n%s" % \
1742
(filename, ('\n'.join(e.msg for e in errors)))
1743
BzrError.__init__(self, message)
1751
BzrError.__init__(self)
1752
self.filename = filename
1753
self.errors = '\n'.join(e.msg for e in errors)
1756
class ConfigOptionValueError(BzrError):
1758
_fmt = ('Bad value "%(value)s" for option "%(name)s".\n'
1759
'See ``brz help %(name)s``')
1761
def __init__(self, name, value):
1762
BzrError.__init__(self, name=name, value=value)
1746
1765
class NoEmailInUsername(BzrError):
1925
1944
_fmt = "Moving the root directory is not supported at this time"
1947
class TransformRenameFailed(BzrError):
1949
_fmt = "Failed to rename %(from_path)s to %(to_path)s: %(why)s"
1951
def __init__(self, from_path, to_path, why, errno):
1952
self.from_path = from_path
1953
self.to_path = to_path
1928
1958
class BzrMoveFailedError(BzrError):
1930
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
1960
_fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
1961
"%(_has_extra)s%(extra)s")
1932
1963
def __init__(self, from_path='', to_path='', extra=None):
1933
from bzrlib.osutils import splitpath
1964
from breezy.osutils import splitpath
1934
1965
BzrError.__init__(self)
1936
self.extra = ': ' + str(extra)
1967
self.extra, self._has_extra = extra, ': '
1969
self.extra = self._has_extra = ''
1940
1971
has_from = len(from_path) > 0
1941
1972
has_to = len(to_path) > 0
1963
1994
class BzrRenameFailedError(BzrMoveFailedError):
1965
_fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
1996
_fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
1997
"%(_has_extra)s%(extra)s")
1967
1999
def __init__(self, from_path, to_path, extra=None):
1968
2000
BzrMoveFailedError.__init__(self, from_path, to_path, extra)
1970
class BzrRemoveChangedFilesError(BzrError):
1971
"""Used when user is trying to remove changed files."""
1973
_fmt = ("Can't safely remove modified or unknown files:\n"
1974
"%(changes_as_text)s"
1975
"Use --keep to not delete them, or --force to delete them regardless.")
1977
def __init__(self, tree_delta):
1978
BzrError.__init__(self)
1979
self.changes_as_text = tree_delta.get_changes_as_text()
1980
#self.paths_as_string = '\n'.join(changed_files)
1981
#self.paths_as_string = '\n'.join([quotefn(p) for p in changed_files])
1984
2003
class BzrBadParameterNotString(BzrBadParameter):
2539
2558
self.tag_name = tag_name
2542
class MalformedBugIdentifier(BzrError):
2544
_fmt = ('Did not understand bug identifier %(bug_id)s: %(reason)s. '
2545
'See "bzr help bugs" for more information on this feature.')
2547
def __init__(self, bug_id, reason):
2548
self.bug_id = bug_id
2549
self.reason = reason
2552
class InvalidBugTrackerURL(BzrError):
2554
_fmt = ("The URL for bug tracker \"%(abbreviation)s\" doesn't "
2555
"contain {id}: %(url)s")
2557
def __init__(self, abbreviation, url):
2558
self.abbreviation = abbreviation
2562
class UnknownBugTrackerAbbreviation(BzrError):
2564
_fmt = ("Cannot find registered bug tracker called %(abbreviation)s "
2567
def __init__(self, abbreviation, branch):
2568
self.abbreviation = abbreviation
2569
self.branch = branch
2572
class InvalidLineInBugsProperty(BzrError):
2574
_fmt = ("Invalid line in bugs property: '%(line)s'")
2576
def __init__(self, line):
2580
class InvalidBugStatus(BzrError):
2582
_fmt = ("Invalid bug status: '%(status)s'")
2584
def __init__(self, status):
2585
self.status = status
2588
2561
class UnexpectedSmartServerResponse(BzrError):
2590
2563
_fmt = "Could not understand response from smart server: %(response_tuple)r"
2615
2588
class UnknownErrorFromSmartServer(BzrError):
2616
"""An ErrorFromSmartServer could not be translated into a typical bzrlib
2589
"""An ErrorFromSmartServer could not be translated into a typical breezy
2619
2592
This is distinct from ErrorFromSmartServer so that it is possible to
2620
2593
distinguish between the following two cases:
2621
- ErrorFromSmartServer was uncaught. This is logic error in the client
2622
and so should provoke a traceback to the user.
2623
- ErrorFromSmartServer was caught but its error_tuple could not be
2624
translated. This is probably because the server sent us garbage, and
2625
should not provoke a traceback.
2595
- ErrorFromSmartServer was uncaught. This is logic error in the client
2596
and so should provoke a traceback to the user.
2597
- ErrorFromSmartServer was caught but its error_tuple could not be
2598
translated. This is probably because the server sent us garbage, and
2599
should not provoke a traceback.
2628
2602
_fmt = "Server sent an unexpected error: %(error_tuple)r"
2753
2719
class BzrDirError(BzrError):
2755
def __init__(self, bzrdir):
2756
import bzrlib.urlutils as urlutils
2757
display_url = urlutils.unescape_for_display(bzrdir.user_url,
2721
def __init__(self, controldir):
2722
from . import urlutils
2723
display_url = urlutils.unescape_for_display(controldir.user_url,
2759
BzrError.__init__(self, bzrdir=bzrdir, display_url=display_url)
2725
BzrError.__init__(self, controldir=controldir, display_url=display_url)
2762
2728
class UnsyncedBranches(BzrDirError):
2764
2730
_fmt = ("'%(display_url)s' is not in sync with %(target_url)s. See"
2765
" bzr help sync-for-reconfigure.")
2731
" brz help sync-for-reconfigure.")
2767
def __init__(self, bzrdir, target_branch):
2768
BzrDirError.__init__(self, bzrdir)
2769
import bzrlib.urlutils as urlutils
2733
def __init__(self, controldir, target_branch):
2734
BzrError.__init__(self, controldir)
2735
from . import urlutils
2770
2736
self.target_url = urlutils.unescape_for_display(target_branch.base,
2826
2792
class UncommittedChanges(BzrError):
2828
2794
_fmt = ('Working tree "%(display_url)s" has uncommitted changes'
2829
' (See bzr status).%(more)s')
2795
' (See brz status).%(more)s')
2831
2797
def __init__(self, tree, more=None):
2832
2798
if more is None:
2835
2801
more = ' ' + more
2836
import bzrlib.urlutils as urlutils
2837
display_url = urlutils.unescape_for_display(
2838
tree.user_url, 'ascii')
2802
import breezy.urlutils as urlutils
2803
user_url = getattr(tree, "user_url", None)
2804
if user_url is None:
2805
display_url = str(tree)
2807
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2839
2808
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2811
class StoringUncommittedNotSupported(BzrError):
2813
_fmt = ('Branch "%(display_url)s" does not support storing uncommitted'
2816
def __init__(self, branch):
2817
import breezy.urlutils as urlutils
2818
user_url = getattr(branch, "user_url", None)
2819
if user_url is None:
2820
display_url = str(branch)
2822
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2823
BzrError.__init__(self, branch=branch, display_url=display_url)
2826
class ShelvedChanges(UncommittedChanges):
2828
_fmt = ('Working tree "%(display_url)s" has shelved changes'
2829
' (See brz shelve --list).%(more)s')
2842
2832
class MissingTemplateVariable(BzrError):
2844
2834
_fmt = 'Variable {%(name)s} is not available.'
2907
2897
'user encoding %(user_encoding)s')
2909
2899
def __init__(self, path, kind):
2910
from bzrlib.osutils import get_user_encoding
2900
from breezy.osutils import get_user_encoding
2911
2901
self.path = path
2912
2902
self.kind = kind
2913
self.user_encoding = osutils.get_user_encoding()
2903
self.user_encoding = get_user_encoding()
2906
class NoSuchConfig(BzrError):
2908
_fmt = ('The "%(config_id)s" configuration does not exist.')
2910
def __init__(self, config_id):
2911
BzrError.__init__(self, config_id=config_id)
2914
class NoSuchConfigOption(BzrError):
2916
_fmt = ('The "%(option_name)s" configuration option does not exist.')
2918
def __init__(self, option_name):
2919
BzrError.__init__(self, option_name=option_name)
2916
2922
class NoSuchAlias(BzrError):
2961
2967
BzrError.__init__(self, unknowns_str=", ".join(unknowns))
2964
class HookFailed(BzrError):
2965
"""Raised when a pre_change_branch_tip hook function fails anything other
2966
than TipChangeRejected.
2968
Note that this exception is no longer raised, and the import is only left
2969
to be nice to code which might catch it in a plugin.
2972
_fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
2973
"%(traceback_text)s%(exc_value)s")
2975
def __init__(self, hook_stage, hook_name, exc_info, warn=True):
2977
symbol_versioning.warn("BzrError HookFailed has been deprecated "
2978
"as of bzrlib 2.1.", DeprecationWarning, stacklevel=2)
2980
self.hook_stage = hook_stage
2981
self.hook_name = hook_name
2982
self.exc_info = exc_info
2983
self.exc_type = exc_info[0]
2984
self.exc_value = exc_info[1]
2985
self.exc_tb = exc_info[2]
2986
self.traceback_text = ''.join(traceback.format_tb(self.exc_tb))
2989
2970
class TipChangeRejected(BzrError):
2990
2971
"""A pre_change_branch_tip hook function may raise this to cleanly and
2991
2972
explicitly abort a change to a branch tip.
3130
3123
class NoColocatedBranchSupport(BzrError):
3132
_fmt = ("%(bzrdir)r does not support co-located branches.")
3134
def __init__(self, bzrdir):
3135
self.bzrdir = bzrdir
3125
_fmt = ("%(controldir)r does not support co-located branches.")
3127
def __init__(self, controldir):
3128
self.controldir = controldir
3131
class NoWhoami(BzrError):
3133
_fmt = ('Unable to determine your name.\n'
3134
"Please, set your name with the 'whoami' command.\n"
3135
'E.g. brz whoami "Your Name <name@example.com>"')
3138
class InvalidPattern(BzrError):
3140
_fmt = ('Invalid pattern(s) found. %(msg)s')
3142
def __init__(self, msg):
3146
class RecursiveBind(BzrError):
3148
_fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
3149
'Please use `brz unbind` to fix.')
3151
def __init__(self, branch_url):
3152
self.branch_url = branch_url
3155
# FIXME: I would prefer to define the config related exception classes in
3156
# config.py but the lazy import mechanism proscribes this -- vila 20101222
3157
class OptionExpansionLoop(BzrError):
3159
_fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
3161
def __init__(self, string, refs):
3162
self.string = string
3163
self.refs = '->'.join(refs)
3166
class ExpandingUnknownOption(BzrError):
3168
_fmt = 'Option "%(name)s" is not defined while expanding "%(string)s".'
3170
def __init__(self, name, string):
3172
self.string = string
3175
class IllegalOptionName(BzrError):
3177
_fmt = 'Option "%(name)s" is not allowed.'
3179
def __init__(self, name):
3183
class NoCompatibleInter(BzrError):
3185
_fmt = ('No compatible object available for operations from %(source)r '
3188
def __init__(self, source, target):
3189
self.source = source
3190
self.target = target
3193
class HpssVfsRequestNotAllowed(BzrError):
3195
_fmt = ("VFS requests over the smart server are not allowed. Encountered: "
3196
"%(method)s, %(arguments)s.")
3198
def __init__(self, method, arguments):
3199
self.method = method
3200
self.arguments = arguments
3203
class UnsupportedKindChange(BzrError):
3205
_fmt = ("Kind change from %(from_kind)s to %(to_kind)s for "
3206
"%(path)s not supported by format %(format)r")
3208
def __init__(self, path, from_kind, to_kind, format):
3210
self.from_kind = from_kind
3211
self.to_kind = to_kind
3212
self.format = format
3215
class MissingFeature(BzrError):
3217
_fmt = ("Missing feature %(feature)s not provided by this "
3218
"version of Bazaar or any plugin.")
3220
def __init__(self, feature):
3221
self.feature = feature
3224
class PatchSyntax(BzrError):
3225
"""Base class for patch syntax errors."""
3228
class BinaryFiles(BzrError):
3230
_fmt = 'Binary files section encountered.'
3232
def __init__(self, orig_name, mod_name):
3233
self.orig_name = orig_name
3234
self.mod_name = mod_name
3237
class MalformedPatchHeader(PatchSyntax):
3239
_fmt = "Malformed patch header. %(desc)s\n%(line)r"
3241
def __init__(self, desc, line):
3246
class MalformedHunkHeader(PatchSyntax):
3248
_fmt = "Malformed hunk header. %(desc)s\n%(line)r"
3250
def __init__(self, desc, line):
3255
class MalformedLine(PatchSyntax):
3257
_fmt = "Malformed line. %(desc)s\n%(line)r"
3259
def __init__(self, desc, line):
3264
class PatchConflict(BzrError):
3266
_fmt = ('Text contents mismatch at line %(line_no)d. Original has '
3267
'"%(orig_line)s", but patch says it should be "%(patch_line)s"')
3269
def __init__(self, line_no, orig_line, patch_line):
3270
self.line_no = line_no
3271
self.orig_line = orig_line.rstrip('\n')
3272
self.patch_line = patch_line.rstrip('\n')
3275
class FeatureAlreadyRegistered(BzrError):
3277
_fmt = 'The feature %(feature)s has already been registered.'
3279
def __init__(self, feature):
3280
self.feature = feature
3283
class ChangesAlreadyStored(BzrCommandError):
3285
_fmt = ('Cannot store uncommitted changes because this branch already'
3286
' stores uncommitted changes.')