/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/errors.py

  • Committer: Jelmer Vernooij
  • Date: 2011-12-11 04:03:47 UTC
  • mfrom: (6352 +trunk)
  • mto: This revision was merged to the branch mainline in revision 6362.
  • Revision ID: jelmer@samba.org-20111211040347-uie6f5a7q4j2591w
Merge bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
"""Exceptions for bzr, and reporting of them.
18
18
"""
19
19
 
20
 
from bzrlib import (
21
 
    osutils,
22
 
    symbol_versioning,
23
 
    i18n,
24
 
    trace,
25
 
    )
26
 
from bzrlib.i18n import gettext
27
 
from bzrlib.patches import (
28
 
    MalformedHunkHeader,
29
 
    MalformedLine,
30
 
    MalformedPatchHeader,
31
 
    PatchConflict,
32
 
    PatchSyntax,
33
 
    )
34
 
 
35
 
 
36
20
# TODO: is there any value in providing the .args field used by standard
37
21
# python exceptions?   A list of values with no names seems less useful
38
22
# to me.
109
93
                # __str__() should always return a 'str' object
110
94
                # never a 'unicode' object.
111
95
                return s
112
 
        except (AttributeError, TypeError, NameError, ValueError, KeyError), e:
113
 
            return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
114
 
                % (self.__class__.__name__,
115
 
                   self.__dict__,
116
 
                   getattr(self, '_fmt', None),
117
 
                   e)
 
96
        except Exception, e:
 
97
            pass # just bind to 'e' for formatting below
 
98
        else:
 
99
            e = None
 
100
        return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
 
101
            % (self.__class__.__name__,
 
102
               self.__dict__,
 
103
               getattr(self, '_fmt', None),
 
104
               e)
118
105
 
119
106
    def __unicode__(self):
120
107
        u = self._format()
143
130
        """Return format string for this exception or None"""
144
131
        fmt = getattr(self, '_fmt', None)
145
132
        if fmt is not None:
146
 
            i18n.install()
147
 
            unicode_fmt = unicode(fmt) #_fmt strings should be ascii
148
 
            if type(fmt) == unicode:
149
 
                trace.mutter("Unicode strings in error.fmt are deprecated")
150
 
            return gettext(unicode_fmt)
151
 
        fmt = getattr(self, '__doc__', None)
152
 
        if fmt is not None:
153
 
            symbol_versioning.warn("%s uses its docstring as a format, "
154
 
                    "it should use _fmt instead" % self.__class__.__name__,
155
 
                    DeprecationWarning)
156
 
            return fmt
157
 
        return 'Unprintable exception %s: dict=%r, fmt=%r' \
158
 
            % (self.__class__.__name__,
159
 
               self.__dict__,
160
 
               getattr(self, '_fmt', None),
161
 
               )
 
133
            from bzrlib.i18n import gettext
 
134
            return gettext(unicode(fmt)) # _fmt strings should be ascii
162
135
 
163
136
    def __eq__(self, other):
164
137
        if self.__class__ is not other.__class__:
177
150
    internal_error = True
178
151
 
179
152
 
180
 
class BzrNewError(BzrError):
181
 
    """Deprecated error base class."""
182
 
    # base classes should override the docstring with their human-
183
 
    # readable explanation
184
 
 
185
 
    def __init__(self, *args, **kwds):
186
 
        # XXX: Use the underlying BzrError to always generate the args
187
 
        # attribute if it doesn't exist.  We can't use super here, because
188
 
        # exceptions are old-style classes in python2.4 (but new in 2.5).
189
 
        # --bmc, 20060426
190
 
        symbol_versioning.warn('BzrNewError was deprecated in bzr 0.13; '
191
 
             'please convert %s to use BzrError instead'
192
 
             % self.__class__.__name__,
193
 
             DeprecationWarning,
194
 
             stacklevel=2)
195
 
        BzrError.__init__(self, *args)
196
 
        for key, value in kwds.items():
197
 
            setattr(self, key, value)
198
 
 
199
 
    def __str__(self):
200
 
        try:
201
 
            # __str__() should always return a 'str' object
202
 
            # never a 'unicode' object.
203
 
            s = self.__doc__ % self.__dict__
204
 
            if isinstance(s, unicode):
205
 
                return s.encode('utf8')
206
 
            return s
207
 
        except (TypeError, NameError, ValueError, KeyError), e:
208
 
            return 'Unprintable exception %s(%r): %r' \
209
 
                % (self.__class__.__name__,
210
 
                   self.__dict__, e)
211
 
 
212
 
 
213
153
class AlreadyBuilding(BzrError):
214
154
 
215
155
    _fmt = "The tree builder is already building a tree."
797
737
        self.path = bzrdir.transport.clone('..').base
798
738
 
799
739
 
800
 
class FileInWrongBranch(BzrError):
801
 
 
802
 
    _fmt = 'File "%(path)s" is not in branch %(branch_base)s.'
803
 
 
804
 
    # use PathNotChild instead
805
 
    @symbol_versioning.deprecated_method(symbol_versioning.deprecated_in((2, 3, 0)))
806
 
    def __init__(self, branch, path):
807
 
        BzrError.__init__(self)
808
 
        self.branch = branch
809
 
        self.branch_base = branch.base
810
 
        self.path = path
811
 
 
812
 
 
813
740
class UnsupportedFormatError(BzrError):
814
741
 
815
742
    _fmt = "Unsupported branch format: %(format)s\nPlease run 'bzr upgrade'"
1228
1155
            self.extra = ''
1229
1156
 
1230
1157
 
1231
 
class HistoryMissing(BzrError):
1232
 
 
1233
 
    _fmt = "%(branch)s is missing %(object_type)s {%(object_id)s}"
1234
 
 
1235
 
 
1236
1158
class AppendRevisionsOnlyViolation(BzrError):
1237
1159
 
1238
1160
    _fmt = ('Operation denied because it would change the main history,'
1303
1225
            not_ancestor_id=not_ancestor_id)
1304
1226
 
1305
1227
 
1306
 
class AmbiguousBase(BzrError):
1307
 
 
1308
 
    def __init__(self, bases):
1309
 
        symbol_versioning.warn("BzrError AmbiguousBase has been deprecated "
1310
 
            "as of bzrlib 0.8.", DeprecationWarning, stacklevel=2)
1311
 
        msg = ("The correct base is unclear, because %s are all equally close"
1312
 
                % ", ".join(bases))
1313
 
        BzrError.__init__(self, msg)
1314
 
        self.bases = bases
1315
 
 
1316
 
 
1317
1228
class NoCommits(BranchError):
1318
1229
 
1319
1230
    _fmt = "Branch %(branch)s has no commits."
1579
1490
            problem we can raise the original error (value from sys.exc_info())
1580
1491
        """
1581
1492
        BzrError.__init__(self)
 
1493
        self.context = context
1582
1494
        self.reload_occurred = reload_occurred
1583
1495
        self.exc_info = exc_info
1584
1496
        self.orig_error = exc_info[1]
1985
1897
        self.prefix = prefix
1986
1898
 
1987
1899
 
1988
 
class MalformedTransform(BzrError):
 
1900
class MalformedTransform(InternalBzrError):
1989
1901
 
1990
1902
    _fmt = "Tree transform is malformed %(conflicts)r"
1991
1903
 
2085
1997
        BzrMoveFailedError.__init__(self, from_path, to_path, extra)
2086
1998
 
2087
1999
 
2088
 
class BzrRemoveChangedFilesError(BzrError):
2089
 
    """Used when user is trying to remove changed files."""
2090
 
 
2091
 
    _fmt = ("Can't safely remove modified or unknown files:\n"
2092
 
        "%(changes_as_text)s"
2093
 
        "Use --keep to not delete them, or --force to delete them regardless.")
2094
 
 
2095
 
    def __init__(self, tree_delta):
2096
 
        symbol_versioning.warn(symbol_versioning.deprecated_in((2, 3, 0)) %
2097
 
            "BzrRemoveChangedFilesError", DeprecationWarning, stacklevel=2)
2098
 
        BzrError.__init__(self)
2099
 
        self.changes_as_text = tree_delta.get_changes_as_text()
2100
 
        #self.paths_as_string = '\n'.join(changed_files)
2101
 
        #self.paths_as_string = '\n'.join([quotefn(p) for p in changed_files])
2102
 
 
2103
 
 
2104
2000
class BzrBadParameterNotString(BzrBadParameter):
2105
2001
 
2106
2002
    _fmt = "Parameter %(param)s is not a string or unicode string."
3040
2936
        from bzrlib.osutils import get_user_encoding
3041
2937
        self.path = path
3042
2938
        self.kind = kind
3043
 
        self.user_encoding = osutils.get_user_encoding()
 
2939
        self.user_encoding = get_user_encoding()
3044
2940
 
3045
2941
 
3046
2942
class NoSuchConfig(BzrError):
3107
3003
        BzrError.__init__(self, unknowns_str=", ".join(unknowns))
3108
3004
 
3109
3005
 
3110
 
class HookFailed(BzrError):
3111
 
    """Raised when a pre_change_branch_tip hook function fails anything other
3112
 
    than TipChangeRejected.
3113
 
 
3114
 
    Note that this exception is no longer raised, and the import is only left
3115
 
    to be nice to code which might catch it in a plugin.
3116
 
    """
3117
 
 
3118
 
    _fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
3119
 
            "%(traceback_text)s%(exc_value)s")
3120
 
 
3121
 
    def __init__(self, hook_stage, hook_name, exc_info, warn=True):
3122
 
        if warn:
3123
 
            symbol_versioning.warn("BzrError HookFailed has been deprecated "
3124
 
                "as of bzrlib 2.1.", DeprecationWarning, stacklevel=2)
3125
 
        import traceback
3126
 
        self.hook_stage = hook_stage
3127
 
        self.hook_name = hook_name
3128
 
        self.exc_info = exc_info
3129
 
        self.exc_type = exc_info[0]
3130
 
        self.exc_value = exc_info[1]
3131
 
        self.exc_tb = exc_info[2]
3132
 
        self.traceback_text = ''.join(traceback.format_tb(self.exc_tb))
3133
 
 
3134
 
 
3135
3006
class TipChangeRejected(BzrError):
3136
3007
    """A pre_change_branch_tip hook function may raise this to cleanly and
3137
3008
    explicitly abort a change to a branch tip.
3367
3238
        self.from_kind = from_kind
3368
3239
        self.to_kind = to_kind
3369
3240
        self.format = format
 
3241
 
 
3242
 
 
3243
class PatchSyntax(BzrError):
 
3244
    """Base class for patch syntax errors."""
 
3245
 
 
3246
 
 
3247
class BinaryFiles(BzrError):
 
3248
 
 
3249
    _fmt = 'Binary files section encountered.'
 
3250
 
 
3251
    def __init__(self, orig_name, mod_name):
 
3252
        self.orig_name = orig_name
 
3253
        self.mod_name = mod_name
 
3254
 
 
3255
 
 
3256
class MalformedPatchHeader(PatchSyntax):
 
3257
 
 
3258
    _fmt = "Malformed patch header.  %(desc)s\n%(line)r"
 
3259
 
 
3260
    def __init__(self, desc, line):
 
3261
        self.desc = desc
 
3262
        self.line = line
 
3263
 
 
3264
 
 
3265
class MalformedHunkHeader(PatchSyntax):
 
3266
 
 
3267
    _fmt = "Malformed hunk header.  %(desc)s\n%(line)r"
 
3268
 
 
3269
    def __init__(self, desc, line):
 
3270
        self.desc = desc
 
3271
        self.line = line
 
3272
 
 
3273
 
 
3274
class MalformedLine(PatchSyntax):
 
3275
 
 
3276
    _fmt = "Malformed line.  %(desc)s\n%(line)r"
 
3277
 
 
3278
    def __init__(self, desc, line):
 
3279
        self.desc = desc
 
3280
        self.line = line
 
3281
 
 
3282
 
 
3283
class PatchConflict(BzrError):
 
3284
 
 
3285
    _fmt = ('Text contents mismatch at line %(line_no)d.  Original has '
 
3286
            '"%(orig_line)s", but patch says it should be "%(patch_line)s"')
 
3287
 
 
3288
    def __init__(self, line_no, orig_line, patch_line):
 
3289
        self.line_no = line_no
 
3290
        self.orig_line = orig_line.rstrip('\n')
 
3291
        self.patch_line = patch_line.rstrip('\n')