~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/errors.py

  • Committer: Andrew Bennetts
  • Date: 2008-07-28 06:53:44 UTC
  • mfrom: (3581 +trunk)
  • mto: This revision was merged to the branch mainline in revision 3583.
  • Revision ID: andrew.bennetts@canonical.com-20080728065344-ocndjoycs903q6fz
Merge bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
93
93
            for key, value in kwds.items():
94
94
                setattr(self, key, value)
95
95
 
96
 
    def __str__(self):
 
96
    def _format(self):
97
97
        s = getattr(self, '_preformatted_string', None)
98
98
        if s is not None:
99
 
            # contains a preformatted message; must be cast to plain str
100
 
            return str(s)
 
99
            # contains a preformatted message
 
100
            return s
101
101
        try:
102
102
            fmt = self._get_format_string()
103
103
            if fmt:
108
108
                s = fmt % d
109
109
                # __str__() should always return a 'str' object
110
110
                # never a 'unicode' object.
111
 
                if isinstance(s, unicode):
112
 
                    return s.encode('utf8')
113
111
                return s
114
112
        except (AttributeError, TypeError, NameError, ValueError, KeyError), e:
115
113
            return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
118
116
                   getattr(self, '_fmt', None),
119
117
                   e)
120
118
 
 
119
    def __unicode__(self):
 
120
        u = self._format()
 
121
        if isinstance(u, str):
 
122
            # Try decoding the str using the default encoding.
 
123
            u = unicode(u)
 
124
        elif not isinstance(u, unicode):
 
125
            # Try to make a unicode object from it, because __unicode__ must
 
126
            # return a unicode object.
 
127
            u = unicode(u)
 
128
        return u
 
129
    
 
130
    def __str__(self):
 
131
        s = self._format()
 
132
        if isinstance(s, unicode):
 
133
            s = s.encode('utf8')
 
134
        else:
 
135
            # __str__ must return a str.
 
136
            s = str(s)
 
137
        return s
 
138
 
121
139
    def _get_format_string(self):
122
140
        """Return format string for this exception or None"""
123
141
        fmt = getattr(self, '_fmt', None)
135
153
               getattr(self, '_fmt', None),
136
154
               )
137
155
 
 
156
    def __eq__(self, other):
 
157
        if self.__class__ != other.__class__:
 
158
            return NotImplemented
 
159
        return self.__dict__ == other.__dict__
 
160
 
138
161
 
139
162
class InternalBzrError(BzrError):
140
163
    """Base class for errors that are internal in nature.
366
389
    # are not intended to be caught anyway.  UI code need not subclass
367
390
    # BzrCommandError, and non-UI code should not throw a subclass of
368
391
    # BzrCommandError.  ADHB 20051211
369
 
    def __init__(self, msg):
370
 
        # Object.__str__() must return a real string
371
 
        # returning a Unicode string is a python error.
372
 
        if isinstance(msg, unicode):
373
 
            self.msg = msg.encode('utf8')
374
 
        else:
375
 
            self.msg = msg
376
 
 
377
 
    def __str__(self):
378
 
        return self.msg
379
392
 
380
393
 
381
394
class NotWriteLocked(BzrError):
562
575
        PathError.__init__(self, base, reason)
563
576
 
564
577
 
 
578
class InvalidRebaseURLs(PathError):
 
579
 
 
580
    _fmt = "URLs differ by more than path: %(from_)r and %(to)r"
 
581
 
 
582
    def __init__(self, from_, to):
 
583
        self.from_ = from_
 
584
        self.to = to
 
585
        PathError.__init__(self, from_, 'URLs differ by more than path.')
 
586
 
 
587
 
565
588
class UnavailableRepresentation(InternalBzrError):
566
589
 
567
590
    _fmt = ("The encoding '%(wanted)s' is not available for key %(key)s which "
848
871
        BzrError.__init__(self, filename=filename, kind=kind)
849
872
 
850
873
 
 
874
class BadFilenameEncoding(BzrError):
 
875
 
 
876
    _fmt = ('Filename %(filename)r is not valid in your current filesystem'
 
877
            ' encoding %(fs_encoding)s')
 
878
 
 
879
    def __init__(self, filename, fs_encoding):
 
880
        BzrError.__init__(self)
 
881
        self.filename = filename
 
882
        self.fs_encoding = fs_encoding
 
883
 
 
884
 
851
885
class ForbiddenControlFileError(BzrError):
852
886
 
853
887
    _fmt = 'Cannot operate on "%(filename)s" because it is a control file'
2760
2794
    def __init__(self, host, port, orig_error):
2761
2795
        BzrError.__init__(self, host=host, port=port,
2762
2796
            orig_error=orig_error[1])
 
2797
 
 
2798
 
 
2799
class UnknownRules(BzrError):
 
2800
 
 
2801
    _fmt = ('Unknown rules detected: %(unknowns_str)s.')
 
2802
 
 
2803
    def __init__(self, unknowns):
 
2804
        BzrError.__init__(self, unknowns_str=", ".join(unknowns))
 
2805
 
 
2806
 
 
2807
class HookFailed(BzrError):
 
2808
    """Raised when a pre_change_branch_tip hook function fails anything other
 
2809
    than TipChangeRejected.
 
2810
    """
 
2811
 
 
2812
    _fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
 
2813
            "%(traceback_text)s%(exc_value)s")
 
2814
 
 
2815
    def __init__(self, hook_stage, hook_name, exc_info):
 
2816
        import traceback
 
2817
        self.hook_stage = hook_stage
 
2818
        self.hook_name = hook_name
 
2819
        self.exc_info = exc_info
 
2820
        self.exc_type = exc_info[0]
 
2821
        self.exc_value = exc_info[1]
 
2822
        self.exc_tb = exc_info[2]
 
2823
        self.traceback_text = ''.join(traceback.format_tb(self.exc_tb))
 
2824
 
 
2825
 
 
2826
class TipChangeRejected(BzrError):
 
2827
    """A pre_change_branch_tip hook function may raise this to cleanly and
 
2828
    explicitly abort a change to a branch tip.
 
2829
    """
 
2830
    
 
2831
    _fmt = u"Tip change rejected: %(msg)s"
 
2832
 
 
2833
    def __init__(self, msg):
 
2834
        self.msg = msg
 
2835