/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: Ian Clatworthy
  • Date: 2008-12-15 06:18:29 UTC
  • mfrom: (3905 +trunk)
  • mto: (3586.1.23 views-ui)
  • mto: This revision was merged to the branch mainline in revision 4030.
  • Revision ID: ian.clatworthy@canonical.com-20081215061829-c8qwa93g71u9fsh5
merge bzr.dev 3905

Show diffs side-by-side

added added

removed removed

Lines of Context:
81
81
        parameters.
82
82
 
83
83
        :param msg: If given, this is the literal complete text for the error,
84
 
        not subject to expansion.
 
84
           not subject to expansion. 'msg' is used instead of 'message' because
 
85
           python evolved and, in 2.6, forbids the use of 'message'.
85
86
        """
86
87
        StandardError.__init__(self)
87
88
        if msg is not None:
102
103
            fmt = self._get_format_string()
103
104
            if fmt:
104
105
                d = dict(self.__dict__)
105
 
                # special case: python2.5 puts the 'message' attribute in a
106
 
                # slot, so it isn't seen in __dict__
107
 
                d['message'] = getattr(self, 'message', 'no message')
108
106
                s = fmt % d
109
107
                # __str__() should always return a 'str' object
110
108
                # never a 'unicode' object.
126
124
            # return a unicode object.
127
125
            u = unicode(u)
128
126
        return u
129
 
    
 
127
 
130
128
    def __str__(self):
131
129
        s = self._format()
132
130
        if isinstance(s, unicode):
136
134
            s = str(s)
137
135
        return s
138
136
 
 
137
    def __repr__(self):
 
138
        return '%s(%s)' % (self.__class__.__name__, str(self))
 
139
 
139
140
    def _get_format_string(self):
140
141
        """Return format string for this exception or None"""
141
142
        fmt = getattr(self, '_fmt', None)
204
205
 
205
206
 
206
207
class AlreadyBuilding(BzrError):
207
 
    
 
208
 
208
209
    _fmt = "The tree builder is already building a tree."
209
210
 
210
211
 
216
217
 
217
218
 
218
219
class BzrCheckError(InternalBzrError):
219
 
    
220
 
    _fmt = "Internal check failed: %(message)s"
221
 
 
222
 
    def __init__(self, message):
223
 
        BzrError.__init__(self)
224
 
        self.message = message
 
220
 
 
221
    _fmt = "Internal check failed: %(msg)s"
 
222
 
 
223
    def __init__(self, msg):
 
224
        BzrError.__init__(self)
 
225
        self.msg = msg
 
226
 
 
227
 
 
228
class DirstateCorrupt(BzrError):
 
229
 
 
230
    _fmt = "The dirstate file (%(state)s) appears to be corrupt: %(msg)s"
 
231
 
 
232
    def __init__(self, state, msg):
 
233
        BzrError.__init__(self)
 
234
        self.state = state
 
235
        self.msg = msg
225
236
 
226
237
 
227
238
class DisabledMethod(InternalBzrError):
1300
1311
 
1301
1312
class WeaveError(BzrError):
1302
1313
 
1303
 
    _fmt = "Error in processing weave: %(message)s"
 
1314
    _fmt = "Error in processing weave: %(msg)s"
1304
1315
 
1305
 
    def __init__(self, message=None):
 
1316
    def __init__(self, msg=None):
1306
1317
        BzrError.__init__(self)
1307
 
        self.message = message
 
1318
        self.msg = msg
1308
1319
 
1309
1320
 
1310
1321
class WeaveRevisionAlreadyPresent(WeaveError):
1416
1427
        self.how = how
1417
1428
 
1418
1429
 
 
1430
class SHA1KnitCorrupt(KnitCorrupt):
 
1431
 
 
1432
    _fmt = ("Knit %(filename)s corrupt: sha-1 of reconstructed text does not "
 
1433
        "match expected sha-1. key %(key)s expected sha %(expected)s actual "
 
1434
        "sha %(actual)s")
 
1435
 
 
1436
    def __init__(self, filename, actual, expected, key, content):
 
1437
        KnitError.__init__(self)
 
1438
        self.filename = filename
 
1439
        self.actual = actual
 
1440
        self.expected = expected
 
1441
        self.key = key
 
1442
        self.content = content
 
1443
 
 
1444
 
1419
1445
class KnitDataStreamIncompatible(KnitError):
1420
1446
    # Not raised anymore, as we can convert data streams.  In future we may
1421
1447
    # need it again for more exotic cases, so we're keeping it around for now.
1460
1486
        self.options = options
1461
1487
 
1462
1488
 
 
1489
class RetryWithNewPacks(BzrError):
 
1490
    """Raised when we realize that the packs on disk have changed.
 
1491
 
 
1492
    This is meant as more of a signaling exception, to trap between where a
 
1493
    local error occurred and the code that can actually handle the error and
 
1494
    code that can retry appropriately.
 
1495
    """
 
1496
 
 
1497
    internal_error = True
 
1498
 
 
1499
    _fmt = ("Pack files have changed, reload and retry. %(orig_error)s")
 
1500
 
 
1501
    def __init__(self, reload_occurred, exc_info):
 
1502
        """create a new RestartWithNewPacks error.
 
1503
 
 
1504
        :param reload_occurred: Set to True if we know that the packs have
 
1505
            already been reloaded, and we are failing because of an in-memory
 
1506
            cache miss. If set to True then we will ignore if a reload says
 
1507
            nothing has changed, because we assume it has already reloaded. If
 
1508
            False, then a reload with nothing changed will force an error.
 
1509
        :param exc_info: The original exception traceback, so if there is a
 
1510
            problem we can raise the original error (value from sys.exc_info())
 
1511
        """
 
1512
        BzrError.__init__(self)
 
1513
        self.reload_occurred = reload_occurred
 
1514
        self.exc_info = exc_info
 
1515
        self.orig_error = exc_info[1]
 
1516
        # TODO: The global error handler should probably treat this by
 
1517
        #       raising/printing the original exception with a bit about
 
1518
        #       RetryWithNewPacks also not being caught
 
1519
 
 
1520
 
1463
1521
class NoSuchExportFormat(BzrError):
1464
1522
    
1465
1523
    _fmt = "Export format %(format)r not supported"
1603
1661
 
1604
1662
    _fmt = '%(source)s is%(permanently)s redirected to %(target)s'
1605
1663
 
1606
 
    def __init__(self, source, target, is_permanent=False, qual_proto=None):
 
1664
    def __init__(self, source, target, is_permanent=False):
1607
1665
        self.source = source
1608
1666
        self.target = target
1609
1667
        if is_permanent:
1610
1668
            self.permanently = ' permanently'
1611
1669
        else:
1612
1670
            self.permanently = ''
1613
 
        self._qualified_proto = qual_proto
1614
1671
        TransportError.__init__(self)
1615
1672
 
1616
 
    def _requalify_url(self, url):
1617
 
        """Restore the qualified proto in front of the url"""
1618
 
        # When this exception is raised, source and target are in
1619
 
        # user readable format. But some transports may use a
1620
 
        # different proto (http+urllib:// will present http:// to
1621
 
        # the user. If a qualified proto is specified, the code
1622
 
        # trapping the exception can get the qualified urls to
1623
 
        # properly handle the redirection themself (creating a
1624
 
        # new transport object from the target url for example).
1625
 
        # But checking that the scheme of the original and
1626
 
        # redirected urls are the same can be tricky. (see the
1627
 
        # FIXME in BzrDir.open_from_transport for the unique use
1628
 
        # case so far).
1629
 
        if self._qualified_proto is None:
1630
 
            return url
1631
 
 
1632
 
        # The TODO related to NotBranchError mention that doing
1633
 
        # that kind of manipulation on the urls may not be the
1634
 
        # exception object job. On the other hand, this object is
1635
 
        # the interface between the code and the user so
1636
 
        # presenting the urls in different ways is indeed its
1637
 
        # job...
1638
 
        import urlparse
1639
 
        proto, netloc, path, query, fragment = urlparse.urlsplit(url)
1640
 
        return urlparse.urlunsplit((self._qualified_proto, netloc, path,
1641
 
                                   query, fragment))
1642
 
 
1643
 
    def get_source_url(self):
1644
 
        return self._requalify_url(self.source)
1645
 
 
1646
 
    def get_target_url(self):
1647
 
        return self._requalify_url(self.target)
1648
 
 
1649
1673
 
1650
1674
class TooManyRedirections(TransportError):
1651
1675
 
1663
1687
        if filename is None:
1664
1688
            filename = ""
1665
1689
        message = "Error(s) parsing config file %s:\n%s" % \
1666
 
            (filename, ('\n'.join(e.message for e in errors)))
 
1690
            (filename, ('\n'.join(e.msg for e in errors)))
1667
1691
        BzrError.__init__(self, message)
1668
1692
 
1669
1693
 
1854
1878
    _fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
1855
1879
 
1856
1880
    def __init__(self, from_path='', to_path='', extra=None):
 
1881
        from bzrlib.osutils import splitpath
1857
1882
        BzrError.__init__(self)
1858
1883
        if extra:
1859
1884
            self.extra = ': ' + str(extra)
1863
1888
        has_from = len(from_path) > 0
1864
1889
        has_to = len(to_path) > 0
1865
1890
        if has_from:
1866
 
            self.from_path = osutils.splitpath(from_path)[-1]
 
1891
            self.from_path = splitpath(from_path)[-1]
1867
1892
        else:
1868
1893
            self.from_path = ''
1869
1894
 
1870
1895
        if has_to:
1871
 
            self.to_path = osutils.splitpath(to_path)[-1]
 
1896
            self.to_path = splitpath(to_path)[-1]
1872
1897
        else:
1873
1898
            self.to_path = ''
1874
1899
 
2498
2523
 
2499
2524
 
2500
2525
class ErrorFromSmartServer(BzrError):
 
2526
    """An error was received from a smart server.
 
2527
 
 
2528
    :seealso: UnknownErrorFromSmartServer
 
2529
    """
2501
2530
 
2502
2531
    _fmt = "Error received from smart server: %(error_tuple)r"
2503
2532
 
2512
2541
        self.error_args = error_tuple[1:]
2513
2542
 
2514
2543
 
 
2544
class UnknownErrorFromSmartServer(BzrError):
 
2545
    """An ErrorFromSmartServer could not be translated into a typical bzrlib
 
2546
    error.
 
2547
 
 
2548
    This is distinct from ErrorFromSmartServer so that it is possible to
 
2549
    distinguish between the following two cases:
 
2550
      - ErrorFromSmartServer was uncaught.  This is logic error in the client
 
2551
        and so should provoke a traceback to the user.
 
2552
      - ErrorFromSmartServer was caught but its error_tuple could not be
 
2553
        translated.  This is probably because the server sent us garbage, and
 
2554
        should not provoke a traceback.
 
2555
    """
 
2556
 
 
2557
    _fmt = "Server sent an unexpected error: %(error_tuple)r"
 
2558
 
 
2559
    internal_error = False
 
2560
 
 
2561
    def __init__(self, error_from_smart_server):
 
2562
        """Constructor.
 
2563
 
 
2564
        :param error_from_smart_server: An ErrorFromSmartServer instance.
 
2565
        """
 
2566
        self.error_from_smart_server = error_from_smart_server
 
2567
        self.error_tuple = error_from_smart_server.error_tuple
 
2568
        
 
2569
 
2515
2570
class ContainerError(BzrError):
2516
2571
    """Base class of container errors."""
2517
2572
 
2769
2824
            'user encoding %(user_encoding)s')
2770
2825
 
2771
2826
    def __init__(self, path, kind):
 
2827
        from bzrlib.osutils import get_user_encoding
2772
2828
        self.path = path
2773
2829
        self.kind = kind
2774
2830
        self.user_encoding = osutils.get_user_encoding()
2850
2906
    def __init__(self, msg):
2851
2907
        self.msg = msg
2852
2908
 
 
2909
class ShelfCorrupt(BzrError):
 
2910
 
 
2911
    _fmt = "Shelf corrupt."
 
2912
 
 
2913
 
 
2914
class NoSuchShelfId(BzrError):
 
2915
 
 
2916
    _fmt = 'No changes are shelved with id "%(shelf_id)d".'
 
2917
 
 
2918
    def __init__(self, shelf_id):
 
2919
        BzrError.__init__(self, shelf_id=shelf_id)
 
2920
 
 
2921
 
 
2922
class UserAbort(BzrError):
 
2923
 
 
2924
    _fmt = 'The user aborted the operation.'
 
2925
 
2853
2926
 
2854
2927
class NoSuchView(BzrError):
2855
2928
    """A view does not exist.