~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/errors.py

  • Committer: Tarmac
  • Author(s): Vincent Ladeuil
  • Date: 2017-01-30 14:42:05 UTC
  • mfrom: (6620.1.1 trunk)
  • Revision ID: tarmac-20170130144205-r8fh2xpmiuxyozpv
Merge  2.7 into trunk including fix for bug #1657238 [r=vila]

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2011 Canonical Ltd
 
1
# Copyright (C) 2005-2013, 2016 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
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
 
 
 
20
from __future__ import absolute_import
35
21
 
36
22
# TODO: is there any value in providing the .args field used by standard
37
23
# python exceptions?   A list of values with no names seems less useful
109
95
                # __str__() should always return a 'str' object
110
96
                # never a 'unicode' object.
111
97
                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)
 
98
        except Exception, e:
 
99
            pass # just bind to 'e' for formatting below
 
100
        else:
 
101
            e = None
 
102
        return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
 
103
            % (self.__class__.__name__,
 
104
               self.__dict__,
 
105
               getattr(self, '_fmt', None),
 
106
               e)
118
107
 
119
108
    def __unicode__(self):
120
109
        u = self._format()
143
132
        """Return format string for this exception or None"""
144
133
        fmt = getattr(self, '_fmt', None)
145
134
        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
 
               )
 
135
            from bzrlib.i18n import gettext
 
136
            return gettext(unicode(fmt)) # _fmt strings should be ascii
162
137
 
163
138
    def __eq__(self, other):
164
139
        if self.__class__ is not other.__class__:
177
152
    internal_error = True
178
153
 
179
154
 
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
155
class AlreadyBuilding(BzrError):
214
156
 
215
157
    _fmt = "The tree builder is already building a tree."
758
700
       self.path = urlutils.unescape_for_display(branch.base, 'ascii')
759
701
 
760
702
 
 
703
class AlreadyControlDirError(PathError):
 
704
 
 
705
    _fmt = 'A control directory already exists: "%(path)s".'
 
706
 
 
707
 
761
708
class AlreadyBranchError(PathError):
762
709
 
763
710
    _fmt = 'Already a branch: "%(path)s".'
764
711
 
765
712
 
 
713
class InvalidBranchName(PathError):
 
714
 
 
715
    _fmt = "Invalid branch name: %(name)s"
 
716
 
 
717
    def __init__(self, name):
 
718
        BzrError.__init__(self)
 
719
        self.name = name
 
720
 
 
721
 
 
722
class ParentBranchExists(AlreadyBranchError):
 
723
 
 
724
    _fmt = 'Parent branch already exists: "%(path)s".'
 
725
 
 
726
 
766
727
class BranchExistsWithoutWorkingTree(PathError):
767
728
 
768
729
    _fmt = 'Directory contains a branch, but no working tree \
797
758
        self.path = bzrdir.transport.clone('..').base
798
759
 
799
760
 
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
761
class UnsupportedFormatError(BzrError):
814
762
 
815
763
    _fmt = "Unsupported branch format: %(format)s\nPlease run 'bzr upgrade'"
834
782
        self.bzrdir = bzrdir_format
835
783
 
836
784
 
 
785
class ParseFormatError(BzrError):
 
786
 
 
787
    _fmt = "Parse error on line %(lineno)d of %(format)s format: %(line)s"
 
788
 
 
789
    def __init__(self, format, lineno, line, text):
 
790
        BzrError.__init__(self)
 
791
        self.format = format
 
792
        self.lineno = lineno
 
793
        self.line = line
 
794
        self.text = text
 
795
 
 
796
 
837
797
class IncompatibleRepositories(BzrError):
838
798
    """Report an error that two repositories are not compatible.
839
799
 
1228
1188
            self.extra = ''
1229
1189
 
1230
1190
 
1231
 
class HistoryMissing(BzrError):
1232
 
 
1233
 
    _fmt = "%(branch)s is missing %(object_type)s {%(object_id)s}"
1234
 
 
1235
 
 
1236
1191
class AppendRevisionsOnlyViolation(BzrError):
1237
1192
 
1238
1193
    _fmt = ('Operation denied because it would change the main history,'
1303
1258
            not_ancestor_id=not_ancestor_id)
1304
1259
 
1305
1260
 
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
1261
class NoCommits(BranchError):
1318
1262
 
1319
1263
    _fmt = "Branch %(branch)s has no commits."
1579
1523
            problem we can raise the original error (value from sys.exc_info())
1580
1524
        """
1581
1525
        BzrError.__init__(self)
 
1526
        self.context = context
1582
1527
        self.reload_occurred = reload_occurred
1583
1528
        self.exc_info = exc_info
1584
1529
        self.orig_error = exc_info[1]
1666
1611
 
1667
1612
    def __init__(self, exc_info):
1668
1613
        import traceback
 
1614
        # GZ 2010-08-10: Cycle with exc_tb/exc_info affects at least one test
1669
1615
        self.exc_type, self.exc_value, self.exc_tb = exc_info
1670
1616
        self.exc_info = exc_info
1671
1617
        traceback_strings = traceback.format_exception(
1816
1762
 
1817
1763
class ConfigOptionValueError(BzrError):
1818
1764
 
1819
 
    _fmt = """Bad value "%(value)s" for option "%(name)s"."""
 
1765
    _fmt = ('Bad value "%(value)s" for option "%(name)s".\n'
 
1766
            'See ``bzr help %(name)s``')
1820
1767
 
1821
1768
    def __init__(self, name, value):
1822
1769
        BzrError.__init__(self, name=name, value=value)
1984
1931
        self.prefix = prefix
1985
1932
 
1986
1933
 
1987
 
class MalformedTransform(BzrError):
 
1934
class MalformedTransform(InternalBzrError):
1988
1935
 
1989
1936
    _fmt = "Tree transform is malformed %(conflicts)r"
1990
1937
 
2084
2031
        BzrMoveFailedError.__init__(self, from_path, to_path, extra)
2085
2032
 
2086
2033
 
2087
 
class BzrRemoveChangedFilesError(BzrError):
2088
 
    """Used when user is trying to remove changed files."""
2089
 
 
2090
 
    _fmt = ("Can't safely remove modified or unknown files:\n"
2091
 
        "%(changes_as_text)s"
2092
 
        "Use --keep to not delete them, or --force to delete them regardless.")
2093
 
 
2094
 
    def __init__(self, tree_delta):
2095
 
        symbol_versioning.warn(symbol_versioning.deprecated_in((2, 3, 0)) %
2096
 
            "BzrRemoveChangedFilesError", DeprecationWarning, stacklevel=2)
2097
 
        BzrError.__init__(self)
2098
 
        self.changes_as_text = tree_delta.get_changes_as_text()
2099
 
        #self.paths_as_string = '\n'.join(changed_files)
2100
 
        #self.paths_as_string = '\n'.join([quotefn(p) for p in changed_files])
2101
 
 
2102
 
 
2103
2034
class BzrBadParameterNotString(BzrBadParameter):
2104
2035
 
2105
2036
    _fmt = "Parameter %(param)s is not a string or unicode string."
2838
2769
    _fmt = "No mail-to address (--mail-to) or output (-o) specified."
2839
2770
 
2840
2771
 
2841
 
class UnknownMailClient(BzrError):
2842
 
 
2843
 
    _fmt = "Unknown mail client: %(mail_client)s"
2844
 
 
2845
 
    def __init__(self, mail_client):
2846
 
        BzrError.__init__(self, mail_client=mail_client)
2847
 
 
2848
 
 
2849
2772
class MailClientNotFound(BzrError):
2850
2773
 
2851
2774
    _fmt = "Unable to find mail client with the following names:"\
2962
2885
        BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2963
2886
 
2964
2887
 
 
2888
class StoringUncommittedNotSupported(BzrError):
 
2889
 
 
2890
    _fmt = ('Branch "%(display_url)s" does not support storing uncommitted'
 
2891
            ' changes.')
 
2892
 
 
2893
    def __init__(self, branch):
 
2894
        import bzrlib.urlutils as urlutils
 
2895
        user_url = getattr(branch, "user_url", None)
 
2896
        if user_url is None:
 
2897
            display_url = str(branch)
 
2898
        else:
 
2899
            display_url = urlutils.unescape_for_display(user_url, 'ascii')
 
2900
        BzrError.__init__(self, branch=branch, display_url=display_url)
 
2901
 
 
2902
 
2965
2903
class ShelvedChanges(UncommittedChanges):
2966
2904
 
2967
2905
    _fmt = ('Working tree "%(display_url)s" has shelved changes'
3039
2977
        from bzrlib.osutils import get_user_encoding
3040
2978
        self.path = path
3041
2979
        self.kind = kind
3042
 
        self.user_encoding = osutils.get_user_encoding()
 
2980
        self.user_encoding = get_user_encoding()
3043
2981
 
3044
2982
 
3045
2983
class NoSuchConfig(BzrError):
3106
3044
        BzrError.__init__(self, unknowns_str=", ".join(unknowns))
3107
3045
 
3108
3046
 
3109
 
class HookFailed(BzrError):
3110
 
    """Raised when a pre_change_branch_tip hook function fails anything other
3111
 
    than TipChangeRejected.
3112
 
 
3113
 
    Note that this exception is no longer raised, and the import is only left
3114
 
    to be nice to code which might catch it in a plugin.
3115
 
    """
3116
 
 
3117
 
    _fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
3118
 
            "%(traceback_text)s%(exc_value)s")
3119
 
 
3120
 
    def __init__(self, hook_stage, hook_name, exc_info, warn=True):
3121
 
        if warn:
3122
 
            symbol_versioning.warn("BzrError HookFailed has been deprecated "
3123
 
                "as of bzrlib 2.1.", DeprecationWarning, stacklevel=2)
3124
 
        import traceback
3125
 
        self.hook_stage = hook_stage
3126
 
        self.hook_name = hook_name
3127
 
        self.exc_info = exc_info
3128
 
        self.exc_type = exc_info[0]
3129
 
        self.exc_value = exc_info[1]
3130
 
        self.exc_tb = exc_info[2]
3131
 
        self.traceback_text = ''.join(traceback.format_tb(self.exc_tb))
3132
 
 
3133
 
 
3134
3047
class TipChangeRejected(BzrError):
3135
3048
    """A pre_change_branch_tip hook function may raise this to cleanly and
3136
3049
    explicitly abort a change to a branch tip.
3329
3242
 
3330
3243
class ExpandingUnknownOption(BzrError):
3331
3244
 
3332
 
    _fmt = 'Option %(name)s is not defined while expanding "%(string)s".'
 
3245
    _fmt = 'Option "%(name)s" is not defined while expanding "%(string)s".'
3333
3246
 
3334
3247
    def __init__(self, name, string):
3335
3248
        self.name = name
3336
3249
        self.string = string
3337
3250
 
3338
3251
 
 
3252
class IllegalOptionName(BzrError):
 
3253
 
 
3254
    _fmt = 'Option "%(name)s" is not allowed.'
 
3255
 
 
3256
    def __init__(self, name):
 
3257
        self.name = name
 
3258
 
 
3259
 
3339
3260
class NoCompatibleInter(BzrError):
3340
3261
 
3341
3262
    _fmt = ('No compatible object available for operations from %(source)r '
3354
3275
    def __init__(self, method, arguments):
3355
3276
        self.method = method
3356
3277
        self.arguments = arguments
 
3278
 
 
3279
 
 
3280
class UnsupportedKindChange(BzrError):
 
3281
 
 
3282
    _fmt = ("Kind change from %(from_kind)s to %(to_kind)s for "
 
3283
            "%(path)s not supported by format %(format)r")
 
3284
 
 
3285
    def __init__(self, path, from_kind, to_kind, format):
 
3286
        self.path = path
 
3287
        self.from_kind = from_kind
 
3288
        self.to_kind = to_kind
 
3289
        self.format = format
 
3290
 
 
3291
 
 
3292
class MissingFeature(BzrError):
 
3293
 
 
3294
    _fmt = ("Missing feature %(feature)s not provided by this "
 
3295
            "version of Bazaar or any plugin.")
 
3296
 
 
3297
    def __init__(self, feature):
 
3298
        self.feature = feature
 
3299
 
 
3300
 
 
3301
class PatchSyntax(BzrError):
 
3302
    """Base class for patch syntax errors."""
 
3303
 
 
3304
 
 
3305
class BinaryFiles(BzrError):
 
3306
 
 
3307
    _fmt = 'Binary files section encountered.'
 
3308
 
 
3309
    def __init__(self, orig_name, mod_name):
 
3310
        self.orig_name = orig_name
 
3311
        self.mod_name = mod_name
 
3312
 
 
3313
 
 
3314
class MalformedPatchHeader(PatchSyntax):
 
3315
 
 
3316
    _fmt = "Malformed patch header.  %(desc)s\n%(line)r"
 
3317
 
 
3318
    def __init__(self, desc, line):
 
3319
        self.desc = desc
 
3320
        self.line = line
 
3321
 
 
3322
 
 
3323
class MalformedHunkHeader(PatchSyntax):
 
3324
 
 
3325
    _fmt = "Malformed hunk header.  %(desc)s\n%(line)r"
 
3326
 
 
3327
    def __init__(self, desc, line):
 
3328
        self.desc = desc
 
3329
        self.line = line
 
3330
 
 
3331
 
 
3332
class MalformedLine(PatchSyntax):
 
3333
 
 
3334
    _fmt = "Malformed line.  %(desc)s\n%(line)r"
 
3335
 
 
3336
    def __init__(self, desc, line):
 
3337
        self.desc = desc
 
3338
        self.line = line
 
3339
 
 
3340
 
 
3341
class PatchConflict(BzrError):
 
3342
 
 
3343
    _fmt = ('Text contents mismatch at line %(line_no)d.  Original has '
 
3344
            '"%(orig_line)s", but patch says it should be "%(patch_line)s"')
 
3345
 
 
3346
    def __init__(self, line_no, orig_line, patch_line):
 
3347
        self.line_no = line_no
 
3348
        self.orig_line = orig_line.rstrip('\n')
 
3349
        self.patch_line = patch_line.rstrip('\n')
 
3350
 
 
3351
 
 
3352
class FeatureAlreadyRegistered(BzrError):
 
3353
 
 
3354
    _fmt = 'The feature %(feature)s has already been registered.'
 
3355
 
 
3356
    def __init__(self, feature):
 
3357
        self.feature = feature
 
3358
 
 
3359
 
 
3360
class ChangesAlreadyStored(BzrCommandError):
 
3361
 
 
3362
    _fmt = ('Cannot store uncommitted changes because this branch already'
 
3363
            ' stores uncommitted changes.')