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
638
_fmt = 'Not a branch: "%(path)s"%(detail)s.'
707
def __init__(self, path, detail=None, bzrdir=None):
708
import bzrlib.urlutils as urlutils
640
def __init__(self, path, detail=None, controldir=None):
641
from . import urlutils
709
642
path = urlutils.unescape_for_display(path, 'ascii')
710
643
if detail is not None:
711
644
detail = ': ' + detail
712
645
self.detail = detail
646
self.controldir = controldir
714
647
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.
650
return '<%s %r>' % (self.__class__.__name__, self.__dict__)
652
def _get_format_string(self):
653
# GZ 2017-06-08: Not the best place to lazy fill detail in.
720
654
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'
655
self.detail = self._get_detail()
656
return super(NotBranchError, self)._get_format_string()
658
def _get_detail(self):
659
if self.controldir is not None:
661
self.controldir.open_repository()
662
except NoRepositoryPresent:
664
except Exception as e:
665
# Just ignore unexpected errors. Raising arbitrary errors
666
# during str(err) can provoke strange bugs. Concretely
667
# Launchpad's codehosting managed to raise NotBranchError
668
# here, and then get stuck in an infinite loop/recursion
669
# trying to str() that error. All this error really cares
670
# about that there's no working repository there, and if
671
# open_repository() fails, there probably isn't.
672
return ': ' + e.__class__.__name__
730
return PathError._format(self)
674
return ': location is a repository'
733
678
class NoSubmitBranch(PathError):
735
680
_fmt = 'No submit branch available for branch "%(path)s"'
737
682
def __init__(self, branch):
738
import bzrlib.urlutils as urlutils
683
from . import urlutils
739
684
self.path = urlutils.unescape_for_display(branch.base, 'ascii')
687
class AlreadyControlDirError(PathError):
689
_fmt = 'A control directory already exists: "%(path)s".'
742
692
class AlreadyBranchError(PathError):
744
694
_fmt = 'Already a branch: "%(path)s".'
697
class InvalidBranchName(PathError):
699
_fmt = "Invalid branch name: %(name)s"
701
def __init__(self, name):
702
BzrError.__init__(self)
706
class ParentBranchExists(AlreadyBranchError):
708
_fmt = 'Parent branch already exists: "%(path)s".'
747
711
class BranchExistsWithoutWorkingTree(PathError):
749
713
_fmt = 'Directory contains a branch, but no working tree \
750
(use bzr checkout if you wish to build a working tree): "%(path)s"'
714
(use brz checkout if you wish to build a working tree): "%(path)s"'
753
717
class AtomicFileAlreadyClosed(PathError):
773
737
class NoRepositoryPresent(BzrError):
775
739
_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
740
def __init__(self, controldir):
741
BzrError.__init__(self)
742
self.path = controldir.transport.clone('..').base
792
745
class UnsupportedFormatError(BzrError):
794
_fmt = "Unsupported branch format: %(format)s\nPlease run 'bzr upgrade'"
747
_fmt = "Unsupported branch format: %(format)s\nPlease run 'brz upgrade'"
797
750
class UnknownFormatError(BzrError):
806
759
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
761
_fmt = "Format %(format)s is not compatible with .bzr version %(controldir)s."
763
def __init__(self, format, controldir_format):
764
BzrError.__init__(self)
766
self.controldir = controldir_format
769
class ParseFormatError(BzrError):
771
_fmt = "Parse error on line %(lineno)d of %(format)s format: %(line)s"
773
def __init__(self, format, lineno, line, text):
774
BzrError.__init__(self)
816
781
class IncompatibleRepositories(BzrError):
1180
1161
class InvalidRevisionSpec(BzrError):
1182
1163
_fmt = ("Requested revision: '%(spec)s' does not exist in branch:"
1183
" %(branch)s%(extra)s")
1164
" %(branch_url)s%(extra)s")
1185
1166
def __init__(self, spec, branch, extra=None):
1186
1167
BzrError.__init__(self, branch=branch, spec=spec)
1168
self.branch_url = getattr(branch, 'user_url', str(branch))
1188
1170
self.extra = '\n' + str(extra)
1190
1172
self.extra = ''
1193
class HistoryMissing(BzrError):
1195
_fmt = "%(branch)s is missing %(object_type)s {%(object_id)s}"
1198
1175
class AppendRevisionsOnlyViolation(BzrError):
1200
1177
_fmt = ('Operation denied because it would change the main history,'
1339
1305
self.error = error
1342
class WeaveError(BzrError):
1344
_fmt = "Error in processing weave: %(msg)s"
1346
def __init__(self, msg=None):
1347
BzrError.__init__(self)
1351
class WeaveRevisionAlreadyPresent(WeaveError):
1353
_fmt = "Revision {%(revision_id)s} already present in %(weave)s"
1355
def __init__(self, revision_id, weave):
1357
WeaveError.__init__(self)
1358
self.revision_id = revision_id
1362
class WeaveRevisionNotPresent(WeaveError):
1364
_fmt = "Revision {%(revision_id)s} not present in %(weave)s"
1366
def __init__(self, revision_id, weave):
1367
WeaveError.__init__(self)
1368
self.revision_id = revision_id
1372
class WeaveFormatError(WeaveError):
1374
_fmt = "Weave invariant violated: %(what)s"
1376
def __init__(self, what):
1377
WeaveError.__init__(self)
1381
class WeaveParentMismatch(WeaveError):
1383
_fmt = "Parents are mismatched between two revisions. %(message)s"
1386
class WeaveInvalidChecksum(WeaveError):
1388
_fmt = "Text did not match it's checksum: %(message)s"
1391
class WeaveTextDiffers(WeaveError):
1393
_fmt = ("Weaves differ on text content. Revision:"
1394
" {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
1396
def __init__(self, revision_id, weave_a, weave_b):
1397
WeaveError.__init__(self)
1398
self.revision_id = revision_id
1399
self.weave_a = weave_a
1400
self.weave_b = weave_b
1403
class WeaveTextDiffers(WeaveError):
1405
_fmt = ("Weaves differ on text content. Revision:"
1406
" {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
1408
def __init__(self, revision_id, weave_a, weave_b):
1409
WeaveError.__init__(self)
1410
self.revision_id = revision_id
1411
self.weave_a = weave_a
1412
self.weave_b = weave_b
1415
1308
class VersionedFileError(BzrError):
1417
1310
_fmt = "Versioned file error"
1733
1652
_fmt = "Working tree has conflicts."
1655
class ConfigContentError(BzrError):
1657
_fmt = "Config file %(filename)s is not UTF-8 encoded\n"
1659
def __init__(self, filename):
1660
BzrError.__init__(self)
1661
self.filename = filename
1736
1664
class ParseConfigError(BzrError):
1666
_fmt = "Error(s) parsing config file %(filename)s:\n%(errors)s"
1738
1668
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)
1669
BzrError.__init__(self)
1670
self.filename = filename
1671
self.errors = '\n'.join(e.msg for e in errors)
1674
class ConfigOptionValueError(BzrError):
1676
_fmt = ('Bad value "%(value)s" for option "%(name)s".\n'
1677
'See ``brz help %(name)s``')
1679
def __init__(self, name, value):
1680
BzrError.__init__(self, name=name, value=value)
1746
1683
class NoEmailInUsername(BzrError):
1925
1862
_fmt = "Moving the root directory is not supported at this time"
1865
class TransformRenameFailed(BzrError):
1867
_fmt = "Failed to rename %(from_path)s to %(to_path)s: %(why)s"
1869
def __init__(self, from_path, to_path, why, errno):
1870
self.from_path = from_path
1871
self.to_path = to_path
1928
1876
class BzrMoveFailedError(BzrError):
1930
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
1878
_fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
1879
"%(_has_extra)s%(extra)s")
1932
1881
def __init__(self, from_path='', to_path='', extra=None):
1933
from bzrlib.osutils import splitpath
1882
from breezy.osutils import splitpath
1934
1883
BzrError.__init__(self)
1936
self.extra = ': ' + str(extra)
1885
self.extra, self._has_extra = extra, ': '
1887
self.extra = self._has_extra = ''
1940
1889
has_from = len(from_path) > 0
1941
1890
has_to = len(to_path) > 0
1963
1912
class BzrRenameFailedError(BzrMoveFailedError):
1965
_fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
1914
_fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
1915
"%(_has_extra)s%(extra)s")
1967
1917
def __init__(self, from_path, to_path, extra=None):
1968
1918
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
1921
class BzrBadParameterNotString(BzrBadParameter):
2615
2552
class UnknownErrorFromSmartServer(BzrError):
2616
"""An ErrorFromSmartServer could not be translated into a typical bzrlib
2553
"""An ErrorFromSmartServer could not be translated into a typical breezy
2619
2556
This is distinct from ErrorFromSmartServer so that it is possible to
2620
2557
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.
2559
- ErrorFromSmartServer was uncaught. This is logic error in the client
2560
and so should provoke a traceback to the user.
2561
- ErrorFromSmartServer was caught but its error_tuple could not be
2562
translated. This is probably because the server sent us garbage, and
2563
should not provoke a traceback.
2628
2566
_fmt = "Server sent an unexpected error: %(error_tuple)r"
2753
2683
class BzrDirError(BzrError):
2755
def __init__(self, bzrdir):
2756
import bzrlib.urlutils as urlutils
2757
display_url = urlutils.unescape_for_display(bzrdir.user_url,
2685
def __init__(self, controldir):
2686
from . import urlutils
2687
display_url = urlutils.unescape_for_display(controldir.user_url,
2759
BzrError.__init__(self, bzrdir=bzrdir, display_url=display_url)
2689
BzrError.__init__(self, controldir=controldir, display_url=display_url)
2762
2692
class UnsyncedBranches(BzrDirError):
2764
2694
_fmt = ("'%(display_url)s' is not in sync with %(target_url)s. See"
2765
" bzr help sync-for-reconfigure.")
2695
" brz help sync-for-reconfigure.")
2767
def __init__(self, bzrdir, target_branch):
2768
BzrDirError.__init__(self, bzrdir)
2769
import bzrlib.urlutils as urlutils
2697
def __init__(self, controldir, target_branch):
2698
BzrError.__init__(self, controldir)
2699
from . import urlutils
2770
2700
self.target_url = urlutils.unescape_for_display(target_branch.base,
2826
2756
class UncommittedChanges(BzrError):
2828
2758
_fmt = ('Working tree "%(display_url)s" has uncommitted changes'
2829
' (See bzr status).%(more)s')
2759
' (See brz status).%(more)s')
2831
2761
def __init__(self, tree, more=None):
2832
2762
if more is None:
2835
2765
more = ' ' + more
2836
import bzrlib.urlutils as urlutils
2837
display_url = urlutils.unescape_for_display(
2838
tree.user_url, 'ascii')
2766
import breezy.urlutils as urlutils
2767
user_url = getattr(tree, "user_url", None)
2768
if user_url is None:
2769
display_url = str(tree)
2771
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2839
2772
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2775
class StoringUncommittedNotSupported(BzrError):
2777
_fmt = ('Branch "%(display_url)s" does not support storing uncommitted'
2780
def __init__(self, branch):
2781
import breezy.urlutils as urlutils
2782
user_url = getattr(branch, "user_url", None)
2783
if user_url is None:
2784
display_url = str(branch)
2786
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2787
BzrError.__init__(self, branch=branch, display_url=display_url)
2790
class ShelvedChanges(UncommittedChanges):
2792
_fmt = ('Working tree "%(display_url)s" has shelved changes'
2793
' (See brz shelve --list).%(more)s')
2842
2796
class MissingTemplateVariable(BzrError):
2844
2798
_fmt = 'Variable {%(name)s} is not available.'
2907
2861
'user encoding %(user_encoding)s')
2909
2863
def __init__(self, path, kind):
2910
from bzrlib.osutils import get_user_encoding
2864
from breezy.osutils import get_user_encoding
2911
2865
self.path = path
2912
2866
self.kind = kind
2913
self.user_encoding = osutils.get_user_encoding()
2867
self.user_encoding = get_user_encoding()
2870
class NoSuchConfig(BzrError):
2872
_fmt = ('The "%(config_id)s" configuration does not exist.')
2874
def __init__(self, config_id):
2875
BzrError.__init__(self, config_id=config_id)
2878
class NoSuchConfigOption(BzrError):
2880
_fmt = ('The "%(option_name)s" configuration option does not exist.')
2882
def __init__(self, option_name):
2883
BzrError.__init__(self, option_name=option_name)
2916
2886
class NoSuchAlias(BzrError):
2961
2931
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
2934
class TipChangeRejected(BzrError):
2990
2935
"""A pre_change_branch_tip hook function may raise this to cleanly and
2991
2936
explicitly abort a change to a branch tip.
3117
3074
self.target_branch = target_branch
3120
class FileTimestampUnavailable(BzrError):
3122
_fmt = "The filestamp for %(path)s is not available."
3124
internal_error = True
3126
def __init__(self, path):
3130
3077
class NoColocatedBranchSupport(BzrError):
3132
_fmt = ("%(bzrdir)r does not support co-located branches.")
3134
def __init__(self, bzrdir):
3135
self.bzrdir = bzrdir
3079
_fmt = ("%(controldir)r does not support co-located branches.")
3081
def __init__(self, controldir):
3082
self.controldir = controldir
3085
class NoWhoami(BzrError):
3087
_fmt = ('Unable to determine your name.\n'
3088
"Please, set your name with the 'whoami' command.\n"
3089
'E.g. brz whoami "Your Name <name@example.com>"')
3092
class InvalidPattern(BzrError):
3094
_fmt = ('Invalid pattern(s) found. %(msg)s')
3096
def __init__(self, msg):
3100
class RecursiveBind(BzrError):
3102
_fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
3103
'Please use `brz unbind` to fix.')
3105
def __init__(self, branch_url):
3106
self.branch_url = branch_url
3109
# FIXME: I would prefer to define the config related exception classes in
3110
# config.py but the lazy import mechanism proscribes this -- vila 20101222
3111
class OptionExpansionLoop(BzrError):
3113
_fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
3115
def __init__(self, string, refs):
3116
self.string = string
3117
self.refs = '->'.join(refs)
3120
class ExpandingUnknownOption(BzrError):
3122
_fmt = 'Option "%(name)s" is not defined while expanding "%(string)s".'
3124
def __init__(self, name, string):
3126
self.string = string
3129
class IllegalOptionName(BzrError):
3131
_fmt = 'Option "%(name)s" is not allowed.'
3133
def __init__(self, name):
3137
class HpssVfsRequestNotAllowed(BzrError):
3139
_fmt = ("VFS requests over the smart server are not allowed. Encountered: "
3140
"%(method)s, %(arguments)s.")
3142
def __init__(self, method, arguments):
3143
self.method = method
3144
self.arguments = arguments
3147
class UnsupportedKindChange(BzrError):
3149
_fmt = ("Kind change from %(from_kind)s to %(to_kind)s for "
3150
"%(path)s not supported by format %(format)r")
3152
def __init__(self, path, from_kind, to_kind, format):
3154
self.from_kind = from_kind
3155
self.to_kind = to_kind
3156
self.format = format
3159
class MissingFeature(BzrError):
3161
_fmt = ("Missing feature %(feature)s not provided by this "
3162
"version of Bazaar or any plugin.")
3164
def __init__(self, feature):
3165
self.feature = feature
3168
class PatchSyntax(BzrError):
3169
"""Base class for patch syntax errors."""
3172
class BinaryFiles(BzrError):
3174
_fmt = 'Binary files section encountered.'
3176
def __init__(self, orig_name, mod_name):
3177
self.orig_name = orig_name
3178
self.mod_name = mod_name
3181
class MalformedPatchHeader(PatchSyntax):
3183
_fmt = "Malformed patch header. %(desc)s\n%(line)r"
3185
def __init__(self, desc, line):
3190
class MalformedHunkHeader(PatchSyntax):
3192
_fmt = "Malformed hunk header. %(desc)s\n%(line)r"
3194
def __init__(self, desc, line):
3199
class MalformedLine(PatchSyntax):
3201
_fmt = "Malformed line. %(desc)s\n%(line)r"
3203
def __init__(self, desc, line):
3208
class PatchConflict(BzrError):
3210
_fmt = ('Text contents mismatch at line %(line_no)d. Original has '
3211
'"%(orig_line)s", but patch says it should be "%(patch_line)s"')
3213
def __init__(self, line_no, orig_line, patch_line):
3214
self.line_no = line_no
3215
self.orig_line = orig_line.rstrip('\n')
3216
self.patch_line = patch_line.rstrip('\n')
3219
class FeatureAlreadyRegistered(BzrError):
3221
_fmt = 'The feature %(feature)s has already been registered.'
3223
def __init__(self, feature):
3224
self.feature = feature
3227
class ChangesAlreadyStored(BzrCommandError):
3229
_fmt = ('Cannot store uncommitted changes because this branch already'
3230
' stores uncommitted changes.')