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."
648
705
_fmt = 'Not a branch: "%(path)s"%(detail)s.'
650
def __init__(self, path, detail=None, controldir=None):
651
from . import urlutils
707
def __init__(self, path, detail=None, bzrdir=None):
708
import bzrlib.urlutils as urlutils
652
709
path = urlutils.unescape_for_display(path, 'ascii')
653
710
if detail is not None:
654
711
detail = ': ' + detail
655
712
self.detail = detail
656
self.controldir = controldir
657
714
PathError.__init__(self, path=path)
660
return '<%s %r>' % (self.__class__.__name__, self.__dict__)
662
def _get_format_string(self):
663
# 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.
664
720
if self.detail is None:
665
self.detail = self._get_detail()
666
return super(NotBranchError, self)._get_format_string()
668
def _get_detail(self):
669
if self.controldir is not None:
671
self.controldir.open_repository()
672
except NoRepositoryPresent:
674
except Exception as e:
675
# Just ignore unexpected errors. Raising arbitrary errors
676
# during str(err) can provoke strange bugs. Concretely
677
# Launchpad's codehosting managed to raise NotBranchError
678
# here, and then get stuck in an infinite loop/recursion
679
# trying to str() that error. All this error really cares
680
# about that there's no working repository there, and if
681
# open_repository() fails, there probably isn't.
682
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'
684
return ': location is a repository'
730
return PathError._format(self)
688
733
class NoSubmitBranch(PathError):
690
735
_fmt = 'No submit branch available for branch "%(path)s"'
692
737
def __init__(self, branch):
693
from . import urlutils
738
import bzrlib.urlutils as urlutils
694
739
self.path = urlutils.unescape_for_display(branch.base, 'ascii')
697
class AlreadyControlDirError(PathError):
699
_fmt = 'A control directory already exists: "%(path)s".'
702
742
class AlreadyBranchError(PathError):
704
744
_fmt = 'Already a branch: "%(path)s".'
707
class InvalidBranchName(PathError):
709
_fmt = "Invalid branch name: %(name)s"
711
def __init__(self, name):
712
BzrError.__init__(self)
716
class ParentBranchExists(AlreadyBranchError):
718
_fmt = 'Parent branch already exists: "%(path)s".'
721
747
class BranchExistsWithoutWorkingTree(PathError):
723
749
_fmt = 'Directory contains a branch, but no working tree \
724
(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"'
727
753
class AtomicFileAlreadyClosed(PathError):
747
773
class NoRepositoryPresent(BzrError):
749
775
_fmt = 'No repository present: "%(path)s"'
750
def __init__(self, controldir):
751
BzrError.__init__(self)
752
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
755
792
class UnsupportedFormatError(BzrError):
757
_fmt = "Unsupported branch format: %(format)s\nPlease run 'brz upgrade'"
794
_fmt = "Unsupported branch format: %(format)s\nPlease run 'bzr upgrade'"
760
797
class UnknownFormatError(BzrError):
769
806
class IncompatibleFormat(BzrError):
771
_fmt = "Format %(format)s is not compatible with .bzr version %(controldir)s."
773
def __init__(self, format, controldir_format):
774
BzrError.__init__(self)
776
self.controldir = controldir_format
779
class ParseFormatError(BzrError):
781
_fmt = "Parse error on line %(lineno)d of %(format)s format: %(line)s"
783
def __init__(self, format, lineno, line, text):
784
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
791
816
class IncompatibleRepositories(BzrError):
1171
1180
class InvalidRevisionSpec(BzrError):
1173
1182
_fmt = ("Requested revision: '%(spec)s' does not exist in branch:"
1174
" %(branch_url)s%(extra)s")
1183
" %(branch)s%(extra)s")
1176
1185
def __init__(self, spec, branch, extra=None):
1177
1186
BzrError.__init__(self, branch=branch, spec=spec)
1178
self.branch_url = getattr(branch, 'user_url', str(branch))
1180
1188
self.extra = '\n' + str(extra)
1182
1190
self.extra = ''
1193
class HistoryMissing(BzrError):
1195
_fmt = "%(branch)s is missing %(object_type)s {%(object_id)s}"
1185
1198
class AppendRevisionsOnlyViolation(BzrError):
1187
1200
_fmt = ('Operation denied because it would change the main history,'
1735
1733
_fmt = "Working tree has conflicts."
1738
class ConfigContentError(BzrError):
1740
_fmt = "Config file %(filename)s is not UTF-8 encoded\n"
1742
def __init__(self, filename):
1743
BzrError.__init__(self)
1744
self.filename = filename
1747
1736
class ParseConfigError(BzrError):
1749
_fmt = "Error(s) parsing config file %(filename)s:\n%(errors)s"
1751
1738
def __init__(self, errors, filename):
1752
BzrError.__init__(self)
1753
self.filename = filename
1754
self.errors = '\n'.join(e.msg for e in errors)
1757
class ConfigOptionValueError(BzrError):
1759
_fmt = ('Bad value "%(value)s" for option "%(name)s".\n'
1760
'See ``brz help %(name)s``')
1762
def __init__(self, name, value):
1763
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)
1766
1746
class NoEmailInUsername(BzrError):
1775
1755
class SigningFailed(BzrError):
1777
_fmt = 'Failed to GPG sign data with command "%(command_line)s"'
1757
_fmt = 'Failed to gpg sign data with command "%(command_line)s"'
1779
1759
def __init__(self, command_line):
1780
1760
BzrError.__init__(self, command_line=command_line)
1783
class SignatureVerificationFailed(BzrError):
1785
_fmt = 'Failed to verify GPG signature data with error "%(error)s"'
1787
def __init__(self, error):
1788
BzrError.__init__(self, error=error)
1791
class DependencyNotPresent(BzrError):
1793
_fmt = 'Unable to import library "%(library)s": %(error)s'
1795
def __init__(self, library, error):
1796
BzrError.__init__(self, library=library, error=error)
1799
class GpgmeNotInstalled(DependencyNotPresent):
1801
_fmt = 'python-gpgme is not installed, it is needed to verify signatures'
1803
def __init__(self, error):
1804
DependencyNotPresent.__init__(self, 'gpgme', error)
1807
1763
class WorkingTreeNotRevision(BzrError):
1809
1765
_fmt = ("The working tree for %(basedir)s has changed since"
1969
1925
_fmt = "Moving the root directory is not supported at this time"
1972
class TransformRenameFailed(BzrError):
1974
_fmt = "Failed to rename %(from_path)s to %(to_path)s: %(why)s"
1976
def __init__(self, from_path, to_path, why, errno):
1977
self.from_path = from_path
1978
self.to_path = to_path
1983
1928
class BzrMoveFailedError(BzrError):
1985
_fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
1986
"%(_has_extra)s%(extra)s")
1930
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
1988
1932
def __init__(self, from_path='', to_path='', extra=None):
1989
from breezy.osutils import splitpath
1933
from bzrlib.osutils import splitpath
1990
1934
BzrError.__init__(self)
1992
self.extra, self._has_extra = extra, ': '
1936
self.extra = ': ' + str(extra)
1994
self.extra = self._has_extra = ''
1996
1940
has_from = len(from_path) > 0
1997
1941
has_to = len(to_path) > 0
2019
1963
class BzrRenameFailedError(BzrMoveFailedError):
2021
_fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
2022
"%(_has_extra)s%(extra)s")
1965
_fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
2024
1967
def __init__(self, from_path, to_path, extra=None):
2025
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])
2028
1984
class BzrBadParameterNotString(BzrBadParameter):
2659
2615
class UnknownErrorFromSmartServer(BzrError):
2660
"""An ErrorFromSmartServer could not be translated into a typical breezy
2616
"""An ErrorFromSmartServer could not be translated into a typical bzrlib
2663
2619
This is distinct from ErrorFromSmartServer so that it is possible to
2664
2620
distinguish between the following two cases:
2666
- ErrorFromSmartServer was uncaught. This is logic error in the client
2667
and so should provoke a traceback to the user.
2668
- ErrorFromSmartServer was caught but its error_tuple could not be
2669
translated. This is probably because the server sent us garbage, and
2670
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.
2673
2628
_fmt = "Server sent an unexpected error: %(error_tuple)r"
2790
2753
class BzrDirError(BzrError):
2792
def __init__(self, controldir):
2793
from . import urlutils
2794
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,
2796
BzrError.__init__(self, controldir=controldir, display_url=display_url)
2759
BzrError.__init__(self, bzrdir=bzrdir, display_url=display_url)
2799
2762
class UnsyncedBranches(BzrDirError):
2801
2764
_fmt = ("'%(display_url)s' is not in sync with %(target_url)s. See"
2802
" brz help sync-for-reconfigure.")
2765
" bzr help sync-for-reconfigure.")
2804
def __init__(self, controldir, target_branch):
2805
BzrError.__init__(self, controldir)
2806
from . import urlutils
2767
def __init__(self, bzrdir, target_branch):
2768
BzrDirError.__init__(self, bzrdir)
2769
import bzrlib.urlutils as urlutils
2807
2770
self.target_url = urlutils.unescape_for_display(target_branch.base,
2863
2826
class UncommittedChanges(BzrError):
2865
2828
_fmt = ('Working tree "%(display_url)s" has uncommitted changes'
2866
' (See brz status).%(more)s')
2829
' (See bzr status).%(more)s')
2868
2831
def __init__(self, tree, more=None):
2869
2832
if more is None:
2872
2835
more = ' ' + more
2873
import breezy.urlutils as urlutils
2874
user_url = getattr(tree, "user_url", None)
2875
if user_url is None:
2876
display_url = str(tree)
2878
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')
2879
2839
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2882
class StoringUncommittedNotSupported(BzrError):
2884
_fmt = ('Branch "%(display_url)s" does not support storing uncommitted'
2887
def __init__(self, branch):
2888
import breezy.urlutils as urlutils
2889
user_url = getattr(branch, "user_url", None)
2890
if user_url is None:
2891
display_url = str(branch)
2893
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2894
BzrError.__init__(self, branch=branch, display_url=display_url)
2897
class ShelvedChanges(UncommittedChanges):
2899
_fmt = ('Working tree "%(display_url)s" has shelved changes'
2900
' (See brz shelve --list).%(more)s')
2903
2842
class MissingTemplateVariable(BzrError):
2905
2844
_fmt = 'Variable {%(name)s} is not available.'
2968
2907
'user encoding %(user_encoding)s')
2970
2909
def __init__(self, path, kind):
2971
from breezy.osutils import get_user_encoding
2910
from bzrlib.osutils import get_user_encoding
2972
2911
self.path = path
2973
2912
self.kind = kind
2974
self.user_encoding = get_user_encoding()
2977
class NoSuchConfig(BzrError):
2979
_fmt = ('The "%(config_id)s" configuration does not exist.')
2981
def __init__(self, config_id):
2982
BzrError.__init__(self, config_id=config_id)
2985
class NoSuchConfigOption(BzrError):
2987
_fmt = ('The "%(option_name)s" configuration option does not exist.')
2989
def __init__(self, option_name):
2990
BzrError.__init__(self, option_name=option_name)
2913
self.user_encoding = osutils.get_user_encoding()
2993
2916
class NoSuchAlias(BzrError):
3038
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))
3041
2989
class TipChangeRejected(BzrError):
3042
2990
"""A pre_change_branch_tip hook function may raise this to cleanly and
3043
2991
explicitly abort a change to a branch tip.
3194
3130
class NoColocatedBranchSupport(BzrError):
3196
_fmt = ("%(controldir)r does not support co-located branches.")
3198
def __init__(self, controldir):
3199
self.controldir = controldir
3202
class NoWhoami(BzrError):
3204
_fmt = ('Unable to determine your name.\n'
3205
"Please, set your name with the 'whoami' command.\n"
3206
'E.g. brz whoami "Your Name <name@example.com>"')
3209
class InvalidPattern(BzrError):
3211
_fmt = ('Invalid pattern(s) found. %(msg)s')
3213
def __init__(self, msg):
3217
class RecursiveBind(BzrError):
3219
_fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
3220
'Please use `brz unbind` to fix.')
3222
def __init__(self, branch_url):
3223
self.branch_url = branch_url
3226
# FIXME: I would prefer to define the config related exception classes in
3227
# config.py but the lazy import mechanism proscribes this -- vila 20101222
3228
class OptionExpansionLoop(BzrError):
3230
_fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
3232
def __init__(self, string, refs):
3233
self.string = string
3234
self.refs = '->'.join(refs)
3237
class ExpandingUnknownOption(BzrError):
3239
_fmt = 'Option "%(name)s" is not defined while expanding "%(string)s".'
3241
def __init__(self, name, string):
3243
self.string = string
3246
class IllegalOptionName(BzrError):
3248
_fmt = 'Option "%(name)s" is not allowed.'
3250
def __init__(self, name):
3254
class NoCompatibleInter(BzrError):
3256
_fmt = ('No compatible object available for operations from %(source)r '
3259
def __init__(self, source, target):
3260
self.source = source
3261
self.target = target
3264
class HpssVfsRequestNotAllowed(BzrError):
3266
_fmt = ("VFS requests over the smart server are not allowed. Encountered: "
3267
"%(method)s, %(arguments)s.")
3269
def __init__(self, method, arguments):
3270
self.method = method
3271
self.arguments = arguments
3274
class UnsupportedKindChange(BzrError):
3276
_fmt = ("Kind change from %(from_kind)s to %(to_kind)s for "
3277
"%(path)s not supported by format %(format)r")
3279
def __init__(self, path, from_kind, to_kind, format):
3281
self.from_kind = from_kind
3282
self.to_kind = to_kind
3283
self.format = format
3286
class MissingFeature(BzrError):
3288
_fmt = ("Missing feature %(feature)s not provided by this "
3289
"version of Bazaar or any plugin.")
3291
def __init__(self, feature):
3292
self.feature = feature
3295
class PatchSyntax(BzrError):
3296
"""Base class for patch syntax errors."""
3299
class BinaryFiles(BzrError):
3301
_fmt = 'Binary files section encountered.'
3303
def __init__(self, orig_name, mod_name):
3304
self.orig_name = orig_name
3305
self.mod_name = mod_name
3308
class MalformedPatchHeader(PatchSyntax):
3310
_fmt = "Malformed patch header. %(desc)s\n%(line)r"
3312
def __init__(self, desc, line):
3317
class MalformedHunkHeader(PatchSyntax):
3319
_fmt = "Malformed hunk header. %(desc)s\n%(line)r"
3321
def __init__(self, desc, line):
3326
class MalformedLine(PatchSyntax):
3328
_fmt = "Malformed line. %(desc)s\n%(line)r"
3330
def __init__(self, desc, line):
3335
class PatchConflict(BzrError):
3337
_fmt = ('Text contents mismatch at line %(line_no)d. Original has '
3338
'"%(orig_line)s", but patch says it should be "%(patch_line)s"')
3340
def __init__(self, line_no, orig_line, patch_line):
3341
self.line_no = line_no
3342
self.orig_line = orig_line.rstrip('\n')
3343
self.patch_line = patch_line.rstrip('\n')
3346
class FeatureAlreadyRegistered(BzrError):
3348
_fmt = 'The feature %(feature)s has already been registered.'
3350
def __init__(self, feature):
3351
self.feature = feature
3354
class ChangesAlreadyStored(BzrCommandError):
3356
_fmt = ('Cannot store uncommitted changes because this branch already'
3357
' stores uncommitted changes.')
3132
_fmt = ("%(bzrdir)r does not support co-located branches.")
3134
def __init__(self, bzrdir):
3135
self.bzrdir = bzrdir