~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/index.py

  • Committer: Robert Collins
  • Date: 2010-04-08 04:34:03 UTC
  • mfrom: (5138 +trunk)
  • mto: This revision was merged to the branch mainline in revision 5139.
  • Revision ID: robertc@robertcollins.net-20100408043403-56z0d07vdqrx7f3t
Update bugfix for 528114 to trunk.

Show diffs side-by-side

added added

removed removed

Lines of Context:
382
382
    suitable for production use. :XXX
383
383
    """
384
384
 
385
 
    def __init__(self, transport, name, size, unlimited_cache=False):
 
385
    def __init__(self, transport, name, size, unlimited_cache=False, offset=0):
386
386
        """Open an index called name on transport.
387
387
 
388
388
        :param transport: A bzrlib.transport.Transport.
394
394
            avoided by having it supplied. If size is None, then bisection
395
395
            support will be disabled and accessing the index will just stream
396
396
            all the data.
 
397
        :param offset: Instead of starting the index data at offset 0, start it
 
398
            at an arbitrary offset.
397
399
        """
398
400
        self._transport = transport
399
401
        self._name = name
416
418
        self._size = size
417
419
        # The number of bytes we've read so far in trying to process this file
418
420
        self._bytes_read = 0
 
421
        self._base_offset = offset
419
422
 
420
423
    def __eq__(self, other):
421
424
        """Equal when self and other were created with the same parameters."""
444
447
            mutter('Reading entire index %s', self._transport.abspath(self._name))
445
448
        if stream is None:
446
449
            stream = self._transport.get(self._name)
 
450
            if self._base_offset != 0:
 
451
                # This is wasteful, but it is better than dealing with
 
452
                # adjusting all the offsets, etc.
 
453
                stream = StringIO(stream.read()[self._base_offset:])
447
454
        self._read_prefix(stream)
448
455
        self._expected_elements = 3 + self._key_length
449
456
        line_count = 0
1190
1197
            self._buffer_all()
1191
1198
            return
1192
1199
 
 
1200
        base_offset = self._base_offset
 
1201
        if base_offset != 0:
 
1202
            # Rewrite the ranges for the offset
 
1203
            readv_ranges = [(start+base_offset, size)
 
1204
                            for start, size in readv_ranges]
1193
1205
        readv_data = self._transport.readv(self._name, readv_ranges, True,
1194
 
            self._size)
 
1206
            self._size + self._base_offset)
1195
1207
        # parse
1196
1208
        for offset, data in readv_data:
 
1209
            offset -= base_offset
1197
1210
            self._bytes_read += len(data)
 
1211
            if offset < 0:
 
1212
                # transport.readv() expanded to extra data which isn't part of
 
1213
                # this index
 
1214
                data = data[-offset:]
 
1215
                offset = 0
1198
1216
            if offset == 0 and len(data) == self._size:
1199
1217
                # We read the whole range, most likely because the
1200
1218
                # Transport upcast our readv ranges into one long request