39
# return codes from the brz program
46
# return codes from the bzr program
42
49
EXIT_INTERNAL_ERROR = 4
45
class BzrError(Exception):
52
class BzrError(StandardError):
47
Base class for errors raised by breezy.
54
Base class for errors raised by bzrlib.
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.)
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.)
54
61
:cvar _fmt: Format string to display the error; this is expanded
55
by the instance's dict.
62
by the instance's dict.
58
65
internal_error = False
100
106
# __str__() should always return a 'str' object
101
107
# never a 'unicode' object.
103
except Exception as e:
105
return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
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.
137
return '%s(%s)' % (self.__class__.__name__, str(self))
139
def _get_format_string(self):
140
"""Return format string for this exception or None"""
141
fmt = getattr(self, '_fmt', 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' \
106
151
% (self.__class__.__name__,
108
153
getattr(self, '_fmt', None),
115
return self._format().encode('utf-8')
117
__unicode__ = _format
120
return '%s(%s)' % (self.__class__.__name__, str(self))
122
def _get_format_string(self):
123
"""Return format string for this exception or None"""
124
fmt = getattr(self, '_fmt', None)
126
from breezy.i18n import gettext
127
return gettext(fmt) # _fmt strings should be ascii
129
156
def __eq__(self, other):
130
157
if self.__class__ is not other.__class__:
131
158
return NotImplemented
132
159
return self.__dict__ == other.__dict__
138
162
class InternalBzrError(BzrError):
139
163
"""Base class for errors that are internal in nature.
146
170
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__,
149
206
class AlreadyBuilding(BzrError):
151
208
_fmt = "The tree builder is already building a tree."
647
705
_fmt = 'Not a branch: "%(path)s"%(detail)s.'
649
def __init__(self, path, detail=None, controldir=None):
650
from . import urlutils
707
def __init__(self, path, detail=None, bzrdir=None):
708
import bzrlib.urlutils as urlutils
651
709
path = urlutils.unescape_for_display(path, 'ascii')
652
710
if detail is not None:
653
711
detail = ': ' + detail
654
712
self.detail = detail
655
self.controldir = controldir
656
714
PathError.__init__(self, path=path)
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.
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.
663
720
if self.detail is None:
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__
721
if self.bzrdir is not None:
723
self.bzrdir.open_repository()
724
except NoRepositoryPresent:
727
self.detail = ': location is a repository'
683
return ': location is a repository'
730
return PathError._format(self)
687
733
class NoSubmitBranch(PathError):
689
735
_fmt = 'No submit branch available for branch "%(path)s"'
691
737
def __init__(self, branch):
692
from . import urlutils
738
import bzrlib.urlutils as urlutils
693
739
self.path = urlutils.unescape_for_display(branch.base, 'ascii')
696
class AlreadyControlDirError(PathError):
698
_fmt = 'A control directory already exists: "%(path)s".'
701
742
class AlreadyBranchError(PathError):
703
744
_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".'
720
747
class BranchExistsWithoutWorkingTree(PathError):
722
749
_fmt = 'Directory contains a branch, but no working tree \
723
(use brz checkout if you wish to build a working tree): "%(path)s"'
750
(use bzr checkout if you wish to build a working tree): "%(path)s"'
726
753
class AtomicFileAlreadyClosed(PathError):
746
773
class NoRepositoryPresent(BzrError):
748
775
_fmt = 'No repository present: "%(path)s"'
749
def __init__(self, controldir):
750
BzrError.__init__(self)
751
self.path = controldir.transport.clone('..').base
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
754
792
class UnsupportedFormatError(BzrError):
756
_fmt = "Unsupported branch format: %(format)s\nPlease run 'brz upgrade'"
794
_fmt = "Unsupported branch format: %(format)s\nPlease run 'bzr upgrade'"
759
797
class UnknownFormatError(BzrError):
768
806
class IncompatibleFormat(BzrError):
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)
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
790
816
class IncompatibleRepositories(BzrError):
1170
1180
class InvalidRevisionSpec(BzrError):
1172
1182
_fmt = ("Requested revision: '%(spec)s' does not exist in branch:"
1173
" %(branch_url)s%(extra)s")
1183
" %(branch)s%(extra)s")
1175
1185
def __init__(self, spec, branch, extra=None):
1176
1186
BzrError.__init__(self, branch=branch, spec=spec)
1177
self.branch_url = getattr(branch, 'user_url', str(branch))
1179
1188
self.extra = '\n' + str(extra)
1181
1190
self.extra = ''
1193
class HistoryMissing(BzrError):
1195
_fmt = "%(branch)s is missing %(object_type)s {%(object_id)s}"
1184
1198
class AppendRevisionsOnlyViolation(BzrError):
1186
1200
_fmt = ('Operation denied because it would change the main history,'
1734
1733
_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
1746
1736
class ParseConfigError(BzrError):
1748
_fmt = "Error(s) parsing config file %(filename)s:\n%(errors)s"
1750
1738
def __init__(self, errors, filename):
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)
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)
1765
1746
class NoEmailInUsername(BzrError):
1774
1755
class SigningFailed(BzrError):
1776
_fmt = 'Failed to GPG sign data with command "%(command_line)s"'
1757
_fmt = 'Failed to gpg sign data with command "%(command_line)s"'
1778
1759
def __init__(self, command_line):
1779
1760
BzrError.__init__(self, command_line=command_line)
1782
class SignatureVerificationFailed(BzrError):
1784
_fmt = 'Failed to verify GPG signature data with error "%(error)s"'
1786
def __init__(self, error):
1787
BzrError.__init__(self, error=error)
1790
class DependencyNotPresent(BzrError):
1792
_fmt = 'Unable to import library "%(library)s": %(error)s'
1794
def __init__(self, library, error):
1795
BzrError.__init__(self, library=library, error=error)
1798
class GpgmeNotInstalled(DependencyNotPresent):
1800
_fmt = 'python-gpgme is not installed, it is needed to verify signatures'
1802
def __init__(self, error):
1803
DependencyNotPresent.__init__(self, 'gpgme', error)
1806
1763
class WorkingTreeNotRevision(BzrError):
1808
1765
_fmt = ("The working tree for %(basedir)s has changed since"
1968
1925
_fmt = "Moving the root directory is not supported at this time"
1971
class TransformRenameFailed(BzrError):
1973
_fmt = "Failed to rename %(from_path)s to %(to_path)s: %(why)s"
1975
def __init__(self, from_path, to_path, why, errno):
1976
self.from_path = from_path
1977
self.to_path = to_path
1982
1928
class BzrMoveFailedError(BzrError):
1984
_fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
1985
"%(_has_extra)s%(extra)s")
1930
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
1987
1932
def __init__(self, from_path='', to_path='', extra=None):
1988
from breezy.osutils import splitpath
1933
from bzrlib.osutils import splitpath
1989
1934
BzrError.__init__(self)
1991
self.extra, self._has_extra = extra, ': '
1936
self.extra = ': ' + str(extra)
1993
self.extra = self._has_extra = ''
1995
1940
has_from = len(from_path) > 0
1996
1941
has_to = len(to_path) > 0
2018
1963
class BzrRenameFailedError(BzrMoveFailedError):
2020
_fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
2021
"%(_has_extra)s%(extra)s")
1965
_fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
2023
1967
def __init__(self, from_path, to_path, extra=None):
2024
1968
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])
2027
1984
class BzrBadParameterNotString(BzrBadParameter):
2658
2615
class UnknownErrorFromSmartServer(BzrError):
2659
"""An ErrorFromSmartServer could not be translated into a typical breezy
2616
"""An ErrorFromSmartServer could not be translated into a typical bzrlib
2662
2619
This is distinct from ErrorFromSmartServer so that it is possible to
2663
2620
distinguish between the following two cases:
2665
- ErrorFromSmartServer was uncaught. This is logic error in the client
2666
and so should provoke a traceback to the user.
2667
- ErrorFromSmartServer was caught but its error_tuple could not be
2668
translated. This is probably because the server sent us garbage, and
2669
should not provoke a traceback.
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.
2672
2628
_fmt = "Server sent an unexpected error: %(error_tuple)r"
2789
2753
class BzrDirError(BzrError):
2791
def __init__(self, controldir):
2792
from . import urlutils
2793
display_url = urlutils.unescape_for_display(controldir.user_url,
2755
def __init__(self, bzrdir):
2756
import bzrlib.urlutils as urlutils
2757
display_url = urlutils.unescape_for_display(bzrdir.user_url,
2795
BzrError.__init__(self, controldir=controldir, display_url=display_url)
2759
BzrError.__init__(self, bzrdir=bzrdir, display_url=display_url)
2798
2762
class UnsyncedBranches(BzrDirError):
2800
2764
_fmt = ("'%(display_url)s' is not in sync with %(target_url)s. See"
2801
" brz help sync-for-reconfigure.")
2765
" bzr help sync-for-reconfigure.")
2803
def __init__(self, controldir, target_branch):
2804
BzrError.__init__(self, controldir)
2805
from . import urlutils
2767
def __init__(self, bzrdir, target_branch):
2768
BzrDirError.__init__(self, bzrdir)
2769
import bzrlib.urlutils as urlutils
2806
2770
self.target_url = urlutils.unescape_for_display(target_branch.base,
2862
2826
class UncommittedChanges(BzrError):
2864
2828
_fmt = ('Working tree "%(display_url)s" has uncommitted changes'
2865
' (See brz status).%(more)s')
2829
' (See bzr status).%(more)s')
2867
2831
def __init__(self, tree, more=None):
2868
2832
if more is None:
2871
2835
more = ' ' + more
2872
import breezy.urlutils as urlutils
2873
user_url = getattr(tree, "user_url", None)
2874
if user_url is None:
2875
display_url = str(tree)
2877
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2836
import bzrlib.urlutils as urlutils
2837
display_url = urlutils.unescape_for_display(
2838
tree.user_url, 'ascii')
2878
2839
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2881
class StoringUncommittedNotSupported(BzrError):
2883
_fmt = ('Branch "%(display_url)s" does not support storing uncommitted'
2886
def __init__(self, branch):
2887
import breezy.urlutils as urlutils
2888
user_url = getattr(branch, "user_url", None)
2889
if user_url is None:
2890
display_url = str(branch)
2892
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2893
BzrError.__init__(self, branch=branch, display_url=display_url)
2896
class ShelvedChanges(UncommittedChanges):
2898
_fmt = ('Working tree "%(display_url)s" has shelved changes'
2899
' (See brz shelve --list).%(more)s')
2902
2842
class MissingTemplateVariable(BzrError):
2904
2844
_fmt = 'Variable {%(name)s} is not available.'
2967
2907
'user encoding %(user_encoding)s')
2969
2909
def __init__(self, path, kind):
2970
from breezy.osutils import get_user_encoding
2910
from bzrlib.osutils import get_user_encoding
2971
2911
self.path = path
2972
2912
self.kind = kind
2973
self.user_encoding = get_user_encoding()
2976
class NoSuchConfig(BzrError):
2978
_fmt = ('The "%(config_id)s" configuration does not exist.')
2980
def __init__(self, config_id):
2981
BzrError.__init__(self, config_id=config_id)
2984
class NoSuchConfigOption(BzrError):
2986
_fmt = ('The "%(option_name)s" configuration option does not exist.')
2988
def __init__(self, option_name):
2989
BzrError.__init__(self, option_name=option_name)
2913
self.user_encoding = osutils.get_user_encoding()
2992
2916
class NoSuchAlias(BzrError):
3037
2961
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))
3040
2989
class TipChangeRejected(BzrError):
3041
2990
"""A pre_change_branch_tip hook function may raise this to cleanly and
3042
2991
explicitly abort a change to a branch tip.
3193
3130
class NoColocatedBranchSupport(BzrError):
3195
_fmt = ("%(controldir)r does not support co-located branches.")
3197
def __init__(self, controldir):
3198
self.controldir = controldir
3201
class NoWhoami(BzrError):
3203
_fmt = ('Unable to determine your name.\n'
3204
"Please, set your name with the 'whoami' command.\n"
3205
'E.g. brz whoami "Your Name <name@example.com>"')
3208
class InvalidPattern(BzrError):
3210
_fmt = ('Invalid pattern(s) found. %(msg)s')
3212
def __init__(self, msg):
3216
class RecursiveBind(BzrError):
3218
_fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
3219
'Please use `brz unbind` to fix.')
3221
def __init__(self, branch_url):
3222
self.branch_url = branch_url
3225
# FIXME: I would prefer to define the config related exception classes in
3226
# config.py but the lazy import mechanism proscribes this -- vila 20101222
3227
class OptionExpansionLoop(BzrError):
3229
_fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
3231
def __init__(self, string, refs):
3232
self.string = string
3233
self.refs = '->'.join(refs)
3236
class ExpandingUnknownOption(BzrError):
3238
_fmt = 'Option "%(name)s" is not defined while expanding "%(string)s".'
3240
def __init__(self, name, string):
3242
self.string = string
3245
class IllegalOptionName(BzrError):
3247
_fmt = 'Option "%(name)s" is not allowed.'
3249
def __init__(self, name):
3253
class NoCompatibleInter(BzrError):
3255
_fmt = ('No compatible object available for operations from %(source)r '
3258
def __init__(self, source, target):
3259
self.source = source
3260
self.target = target
3263
class HpssVfsRequestNotAllowed(BzrError):
3265
_fmt = ("VFS requests over the smart server are not allowed. Encountered: "
3266
"%(method)s, %(arguments)s.")
3268
def __init__(self, method, arguments):
3269
self.method = method
3270
self.arguments = arguments
3273
class UnsupportedKindChange(BzrError):
3275
_fmt = ("Kind change from %(from_kind)s to %(to_kind)s for "
3276
"%(path)s not supported by format %(format)r")
3278
def __init__(self, path, from_kind, to_kind, format):
3280
self.from_kind = from_kind
3281
self.to_kind = to_kind
3282
self.format = format
3285
class MissingFeature(BzrError):
3287
_fmt = ("Missing feature %(feature)s not provided by this "
3288
"version of Bazaar or any plugin.")
3290
def __init__(self, feature):
3291
self.feature = feature
3294
class PatchSyntax(BzrError):
3295
"""Base class for patch syntax errors."""
3298
class BinaryFiles(BzrError):
3300
_fmt = 'Binary files section encountered.'
3302
def __init__(self, orig_name, mod_name):
3303
self.orig_name = orig_name
3304
self.mod_name = mod_name
3307
class MalformedPatchHeader(PatchSyntax):
3309
_fmt = "Malformed patch header. %(desc)s\n%(line)r"
3311
def __init__(self, desc, line):
3316
class MalformedHunkHeader(PatchSyntax):
3318
_fmt = "Malformed hunk header. %(desc)s\n%(line)r"
3320
def __init__(self, desc, line):
3325
class MalformedLine(PatchSyntax):
3327
_fmt = "Malformed line. %(desc)s\n%(line)r"
3329
def __init__(self, desc, line):
3334
class PatchConflict(BzrError):
3336
_fmt = ('Text contents mismatch at line %(line_no)d. Original has '
3337
'"%(orig_line)s", but patch says it should be "%(patch_line)s"')
3339
def __init__(self, line_no, orig_line, patch_line):
3340
self.line_no = line_no
3341
self.orig_line = orig_line.rstrip('\n')
3342
self.patch_line = patch_line.rstrip('\n')
3345
class FeatureAlreadyRegistered(BzrError):
3347
_fmt = 'The feature %(feature)s has already been registered.'
3349
def __init__(self, feature):
3350
self.feature = feature
3353
class ChangesAlreadyStored(BzrCommandError):
3355
_fmt = ('Cannot store uncommitted changes because this branch already'
3356
' stores uncommitted changes.')
3132
_fmt = ("%(bzrdir)r does not support co-located branches.")
3134
def __init__(self, bzrdir):
3135
self.bzrdir = bzrdir