96
101
# never a 'unicode' object.
98
103
except Exception as e:
99
pass # just bind to 'e' for formatting below
102
105
return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
103
106
% (self.__class__.__name__,
105
108
getattr(self, '_fmt', None),
108
def __unicode__(self):
110
if isinstance(u, str):
111
# Try decoding the str using the default encoding.
113
elif not isinstance(u, unicode):
114
# Try to make a unicode object from it, because __unicode__ must
115
# return a unicode object.
121
if isinstance(s, unicode):
124
# __str__ must return a str.
115
return self._format().encode('utf-8')
117
__unicode__ = _format
128
119
def __repr__(self):
129
120
return '%s(%s)' % (self.__class__.__name__, str(self))
133
124
fmt = getattr(self, '_fmt', None)
134
125
if fmt is not None:
135
126
from breezy.i18n import gettext
136
return gettext(unicode(fmt)) # _fmt strings should be ascii
127
return gettext(fmt) # _fmt strings should be ascii
138
129
def __eq__(self, other):
139
130
if self.__class__ is not other.__class__:
140
131
return NotImplemented
141
132
return self.__dict__ == other.__dict__
144
138
class InternalBzrError(BzrError):
145
139
"""Base class for errors that are internal in nature.
665
659
def __repr__(self):
666
660
return '<%s %r>' % (self.__class__.__name__, self.__dict__)
669
# XXX: Ideally self.detail would be a property, but Exceptions in
670
# Python 2.4 have to be old-style classes so properties don't work.
671
# Instead we override _format.
662
def _get_format_string(self):
663
# GZ 2017-06-08: Not the best place to lazy fill detail in.
672
664
if self.detail is None:
673
if self.bzrdir is not None:
675
self.bzrdir.open_repository()
676
except NoRepositoryPresent:
679
# Just ignore unexpected errors. Raising arbitrary errors
680
# during str(err) can provoke strange bugs. Concretely
681
# Launchpad's codehosting managed to raise NotBranchError
682
# here, and then get stuck in an infinite loop/recursion
683
# trying to str() that error. All this error really cares
684
# about that there's no working repository there, and if
685
# open_repository() fails, there probably isn't.
688
self.detail = ': location is a repository'
665
self.detail = self._get_detail()
666
return super(NotBranchError, self)._get_format_string()
668
def _get_detail(self):
669
if self.bzrdir is not None:
671
self.bzrdir.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__
691
return PathError._format(self)
684
return ': location is a repository'
694
688
class NoSubmitBranch(PathError):