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."
569
511
_fmt = 'Permission denied: "%(path)s"%(extra)s'
572
class InvalidURL(PathError):
574
_fmt = 'Invalid url supplied to transport: "%(path)s"%(extra)s'
577
class InvalidURLJoin(PathError):
579
_fmt = "Invalid URL join request: %(reason)s: %(base)r + %(join_args)r"
581
def __init__(self, reason, base, join_args):
584
self.join_args = join_args
585
PathError.__init__(self, base, reason)
588
class InvalidRebaseURLs(PathError):
590
_fmt = "URLs differ by more than path: %(from_)r and %(to)r"
592
def __init__(self, from_, to):
595
PathError.__init__(self, from_, 'URLs differ by more than path.')
598
514
class UnavailableRepresentation(InternalBzrError):
600
516
_fmt = ("The encoding '%(wanted)s' is not available for key %(key)s which "
705
621
_fmt = 'Not a branch: "%(path)s"%(detail)s.'
707
def __init__(self, path, detail=None, bzrdir=None):
708
import bzrlib.urlutils as urlutils
623
def __init__(self, path, detail=None, controldir=None):
624
from . import urlutils
709
625
path = urlutils.unescape_for_display(path, 'ascii')
710
626
if detail is not None:
711
627
detail = ': ' + detail
712
628
self.detail = detail
629
self.controldir = controldir
714
630
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.
633
return '<%s %r>' % (self.__class__.__name__, self.__dict__)
635
def _get_format_string(self):
636
# GZ 2017-06-08: Not the best place to lazy fill detail in.
720
637
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'
638
self.detail = self._get_detail()
639
return super(NotBranchError, self)._get_format_string()
641
def _get_detail(self):
642
if self.controldir is not None:
644
self.controldir.open_repository()
645
except NoRepositoryPresent:
647
except Exception as e:
648
# Just ignore unexpected errors. Raising arbitrary errors
649
# during str(err) can provoke strange bugs. Concretely
650
# Launchpad's codehosting managed to raise NotBranchError
651
# here, and then get stuck in an infinite loop/recursion
652
# trying to str() that error. All this error really cares
653
# about that there's no working repository there, and if
654
# open_repository() fails, there probably isn't.
655
return ': ' + e.__class__.__name__
730
return PathError._format(self)
657
return ': location is a repository'
733
661
class NoSubmitBranch(PathError):
735
663
_fmt = 'No submit branch available for branch "%(path)s"'
737
665
def __init__(self, branch):
738
import bzrlib.urlutils as urlutils
666
from . import urlutils
739
667
self.path = urlutils.unescape_for_display(branch.base, 'ascii')
670
class AlreadyControlDirError(PathError):
672
_fmt = 'A control directory already exists: "%(path)s".'
742
675
class AlreadyBranchError(PathError):
744
677
_fmt = 'Already a branch: "%(path)s".'
680
class InvalidBranchName(PathError):
682
_fmt = "Invalid branch name: %(name)s"
684
def __init__(self, name):
685
BzrError.__init__(self)
689
class ParentBranchExists(AlreadyBranchError):
691
_fmt = 'Parent branch already exists: "%(path)s".'
747
694
class BranchExistsWithoutWorkingTree(PathError):
749
696
_fmt = 'Directory contains a branch, but no working tree \
750
(use bzr checkout if you wish to build a working tree): "%(path)s"'
697
(use brz checkout if you wish to build a working tree): "%(path)s"'
753
700
class AtomicFileAlreadyClosed(PathError):
773
720
class NoRepositoryPresent(BzrError):
775
722
_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
723
def __init__(self, controldir):
724
BzrError.__init__(self)
725
self.path = controldir.transport.clone('..').base
792
728
class UnsupportedFormatError(BzrError):
794
_fmt = "Unsupported branch format: %(format)s\nPlease run 'bzr upgrade'"
730
_fmt = "Unsupported branch format: %(format)s\nPlease run 'brz upgrade'"
797
733
class UnknownFormatError(BzrError):
806
742
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
744
_fmt = "Format %(format)s is not compatible with .bzr version %(controldir)s."
746
def __init__(self, format, controldir_format):
747
BzrError.__init__(self)
749
self.controldir = controldir_format
752
class ParseFormatError(BzrError):
754
_fmt = "Parse error on line %(lineno)d of %(format)s format: %(line)s"
756
def __init__(self, format, lineno, line, text):
757
BzrError.__init__(self)
816
764
class IncompatibleRepositories(BzrError):
1180
1144
class InvalidRevisionSpec(BzrError):
1182
1146
_fmt = ("Requested revision: '%(spec)s' does not exist in branch:"
1183
" %(branch)s%(extra)s")
1147
" %(branch_url)s%(extra)s")
1185
1149
def __init__(self, spec, branch, extra=None):
1186
1150
BzrError.__init__(self, branch=branch, spec=spec)
1151
self.branch_url = getattr(branch, 'user_url', str(branch))
1188
1153
self.extra = '\n' + str(extra)
1190
1155
self.extra = ''
1193
class HistoryMissing(BzrError):
1195
_fmt = "%(branch)s is missing %(object_type)s {%(object_id)s}"
1198
1158
class AppendRevisionsOnlyViolation(BzrError):
1200
1160
_fmt = ('Operation denied because it would change the main history,'
1733
1708
_fmt = "Working tree has conflicts."
1711
class ConfigContentError(BzrError):
1713
_fmt = "Config file %(filename)s is not UTF-8 encoded\n"
1715
def __init__(self, filename):
1716
BzrError.__init__(self)
1717
self.filename = filename
1736
1720
class ParseConfigError(BzrError):
1722
_fmt = "Error(s) parsing config file %(filename)s:\n%(errors)s"
1738
1724
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)
1725
BzrError.__init__(self)
1726
self.filename = filename
1727
self.errors = '\n'.join(e.msg for e in errors)
1730
class ConfigOptionValueError(BzrError):
1732
_fmt = ('Bad value "%(value)s" for option "%(name)s".\n'
1733
'See ``brz help %(name)s``')
1735
def __init__(self, name, value):
1736
BzrError.__init__(self, name=name, value=value)
1746
1739
class NoEmailInUsername(BzrError):
1925
1918
_fmt = "Moving the root directory is not supported at this time"
1921
class TransformRenameFailed(BzrError):
1923
_fmt = "Failed to rename %(from_path)s to %(to_path)s: %(why)s"
1925
def __init__(self, from_path, to_path, why, errno):
1926
self.from_path = from_path
1927
self.to_path = to_path
1928
1932
class BzrMoveFailedError(BzrError):
1930
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
1934
_fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
1935
"%(_has_extra)s%(extra)s")
1932
1937
def __init__(self, from_path='', to_path='', extra=None):
1933
from bzrlib.osutils import splitpath
1938
from breezy.osutils import splitpath
1934
1939
BzrError.__init__(self)
1936
self.extra = ': ' + str(extra)
1941
self.extra, self._has_extra = extra, ': '
1943
self.extra = self._has_extra = ''
1940
1945
has_from = len(from_path) > 0
1941
1946
has_to = len(to_path) > 0
1963
1968
class BzrRenameFailedError(BzrMoveFailedError):
1965
_fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
1970
_fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
1971
"%(_has_extra)s%(extra)s")
1967
1973
def __init__(self, from_path, to_path, extra=None):
1968
1974
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
1977
class BzrBadParameterNotString(BzrBadParameter):
2615
2608
class UnknownErrorFromSmartServer(BzrError):
2616
"""An ErrorFromSmartServer could not be translated into a typical bzrlib
2609
"""An ErrorFromSmartServer could not be translated into a typical breezy
2619
2612
This is distinct from ErrorFromSmartServer so that it is possible to
2620
2613
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.
2615
- ErrorFromSmartServer was uncaught. This is logic error in the client
2616
and so should provoke a traceback to the user.
2617
- ErrorFromSmartServer was caught but its error_tuple could not be
2618
translated. This is probably because the server sent us garbage, and
2619
should not provoke a traceback.
2628
2622
_fmt = "Server sent an unexpected error: %(error_tuple)r"
2753
2739
class BzrDirError(BzrError):
2755
def __init__(self, bzrdir):
2756
import bzrlib.urlutils as urlutils
2757
display_url = urlutils.unescape_for_display(bzrdir.user_url,
2741
def __init__(self, controldir):
2742
from . import urlutils
2743
display_url = urlutils.unescape_for_display(controldir.user_url,
2759
BzrError.__init__(self, bzrdir=bzrdir, display_url=display_url)
2745
BzrError.__init__(self, controldir=controldir, display_url=display_url)
2762
2748
class UnsyncedBranches(BzrDirError):
2764
2750
_fmt = ("'%(display_url)s' is not in sync with %(target_url)s. See"
2765
" bzr help sync-for-reconfigure.")
2751
" brz help sync-for-reconfigure.")
2767
def __init__(self, bzrdir, target_branch):
2768
BzrDirError.__init__(self, bzrdir)
2769
import bzrlib.urlutils as urlutils
2753
def __init__(self, controldir, target_branch):
2754
BzrError.__init__(self, controldir)
2755
from . import urlutils
2770
2756
self.target_url = urlutils.unescape_for_display(target_branch.base,
2826
2812
class UncommittedChanges(BzrError):
2828
2814
_fmt = ('Working tree "%(display_url)s" has uncommitted changes'
2829
' (See bzr status).%(more)s')
2815
' (See brz status).%(more)s')
2831
2817
def __init__(self, tree, more=None):
2832
2818
if more is None:
2835
2821
more = ' ' + more
2836
import bzrlib.urlutils as urlutils
2837
display_url = urlutils.unescape_for_display(
2838
tree.user_url, 'ascii')
2822
import breezy.urlutils as urlutils
2823
user_url = getattr(tree, "user_url", None)
2824
if user_url is None:
2825
display_url = str(tree)
2827
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2839
2828
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2831
class StoringUncommittedNotSupported(BzrError):
2833
_fmt = ('Branch "%(display_url)s" does not support storing uncommitted'
2836
def __init__(self, branch):
2837
import breezy.urlutils as urlutils
2838
user_url = getattr(branch, "user_url", None)
2839
if user_url is None:
2840
display_url = str(branch)
2842
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2843
BzrError.__init__(self, branch=branch, display_url=display_url)
2846
class ShelvedChanges(UncommittedChanges):
2848
_fmt = ('Working tree "%(display_url)s" has shelved changes'
2849
' (See brz shelve --list).%(more)s')
2842
2852
class MissingTemplateVariable(BzrError):
2844
2854
_fmt = 'Variable {%(name)s} is not available.'
2907
2917
'user encoding %(user_encoding)s')
2909
2919
def __init__(self, path, kind):
2910
from bzrlib.osutils import get_user_encoding
2920
from breezy.osutils import get_user_encoding
2911
2921
self.path = path
2912
2922
self.kind = kind
2913
self.user_encoding = osutils.get_user_encoding()
2923
self.user_encoding = get_user_encoding()
2926
class NoSuchConfig(BzrError):
2928
_fmt = ('The "%(config_id)s" configuration does not exist.')
2930
def __init__(self, config_id):
2931
BzrError.__init__(self, config_id=config_id)
2934
class NoSuchConfigOption(BzrError):
2936
_fmt = ('The "%(option_name)s" configuration option does not exist.')
2938
def __init__(self, option_name):
2939
BzrError.__init__(self, option_name=option_name)
2916
2942
class NoSuchAlias(BzrError):
2961
2987
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
2990
class TipChangeRejected(BzrError):
2990
2991
"""A pre_change_branch_tip hook function may raise this to cleanly and
2991
2992
explicitly abort a change to a branch tip.
3130
3143
class NoColocatedBranchSupport(BzrError):
3132
_fmt = ("%(bzrdir)r does not support co-located branches.")
3134
def __init__(self, bzrdir):
3135
self.bzrdir = bzrdir
3145
_fmt = ("%(controldir)r does not support co-located branches.")
3147
def __init__(self, controldir):
3148
self.controldir = controldir
3151
class NoWhoami(BzrError):
3153
_fmt = ('Unable to determine your name.\n'
3154
"Please, set your name with the 'whoami' command.\n"
3155
'E.g. brz whoami "Your Name <name@example.com>"')
3158
class InvalidPattern(BzrError):
3160
_fmt = ('Invalid pattern(s) found. %(msg)s')
3162
def __init__(self, msg):
3166
class RecursiveBind(BzrError):
3168
_fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
3169
'Please use `brz unbind` to fix.')
3171
def __init__(self, branch_url):
3172
self.branch_url = branch_url
3175
# FIXME: I would prefer to define the config related exception classes in
3176
# config.py but the lazy import mechanism proscribes this -- vila 20101222
3177
class OptionExpansionLoop(BzrError):
3179
_fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
3181
def __init__(self, string, refs):
3182
self.string = string
3183
self.refs = '->'.join(refs)
3186
class ExpandingUnknownOption(BzrError):
3188
_fmt = 'Option "%(name)s" is not defined while expanding "%(string)s".'
3190
def __init__(self, name, string):
3192
self.string = string
3195
class IllegalOptionName(BzrError):
3197
_fmt = 'Option "%(name)s" is not allowed.'
3199
def __init__(self, name):
3203
class NoCompatibleInter(BzrError):
3205
_fmt = ('No compatible object available for operations from %(source)r '
3208
def __init__(self, source, target):
3209
self.source = source
3210
self.target = target
3213
class HpssVfsRequestNotAllowed(BzrError):
3215
_fmt = ("VFS requests over the smart server are not allowed. Encountered: "
3216
"%(method)s, %(arguments)s.")
3218
def __init__(self, method, arguments):
3219
self.method = method
3220
self.arguments = arguments
3223
class UnsupportedKindChange(BzrError):
3225
_fmt = ("Kind change from %(from_kind)s to %(to_kind)s for "
3226
"%(path)s not supported by format %(format)r")
3228
def __init__(self, path, from_kind, to_kind, format):
3230
self.from_kind = from_kind
3231
self.to_kind = to_kind
3232
self.format = format
3235
class MissingFeature(BzrError):
3237
_fmt = ("Missing feature %(feature)s not provided by this "
3238
"version of Bazaar or any plugin.")
3240
def __init__(self, feature):
3241
self.feature = feature
3244
class PatchSyntax(BzrError):
3245
"""Base class for patch syntax errors."""
3248
class BinaryFiles(BzrError):
3250
_fmt = 'Binary files section encountered.'
3252
def __init__(self, orig_name, mod_name):
3253
self.orig_name = orig_name
3254
self.mod_name = mod_name
3257
class MalformedPatchHeader(PatchSyntax):
3259
_fmt = "Malformed patch header. %(desc)s\n%(line)r"
3261
def __init__(self, desc, line):
3266
class MalformedHunkHeader(PatchSyntax):
3268
_fmt = "Malformed hunk header. %(desc)s\n%(line)r"
3270
def __init__(self, desc, line):
3275
class MalformedLine(PatchSyntax):
3277
_fmt = "Malformed line. %(desc)s\n%(line)r"
3279
def __init__(self, desc, line):
3284
class PatchConflict(BzrError):
3286
_fmt = ('Text contents mismatch at line %(line_no)d. Original has '
3287
'"%(orig_line)s", but patch says it should be "%(patch_line)s"')
3289
def __init__(self, line_no, orig_line, patch_line):
3290
self.line_no = line_no
3291
self.orig_line = orig_line.rstrip('\n')
3292
self.patch_line = patch_line.rstrip('\n')
3295
class FeatureAlreadyRegistered(BzrError):
3297
_fmt = 'The feature %(feature)s has already been registered.'
3299
def __init__(self, feature):
3300
self.feature = feature
3303
class ChangesAlreadyStored(BzrCommandError):
3305
_fmt = ('Cannot store uncommitted changes because this branch already'
3306
' stores uncommitted changes.')