~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tuned_gzip.py

(mbp) merge bzr.dev to 0.8, prepare for release

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
import struct
25
25
import zlib
26
26
 
 
27
# we want a \n preserved, break on \n only splitlines.
 
28
import bzrlib
 
29
 
27
30
__all__ = ["GzipFile"]
28
31
 
29
32
 
91
94
        if buf == "":
92
95
            self._add_read_data(self.decompress.flush())
93
96
            assert len(self.decompress.unused_data) >= 8, "what does flush do?"
 
97
            self._gzip_tail = self.decompress.unused_data[0:8]
94
98
            self._read_eof()
95
99
            # tell the driving read() call we have stuffed all the data
96
100
            # in self.extrabuf
112
116
            if seek_length > 0:
113
117
                # we read too much data
114
118
                self.fileobj.seek(-seek_length, 1)
 
119
                self._gzip_tail = self.decompress.unused_data[0:8]
115
120
            elif seek_length < 0:
116
121
                # we haven't read enough to check the checksum.
117
122
                assert -8 < seek_length, "too great a seek."
118
123
                buf = self.fileobj.read(-seek_length)
119
 
                self.decompress.decompress(buf)
 
124
                self._gzip_tail = self.decompress.unused_data + buf
 
125
            else:
 
126
                self._gzip_tail = self.decompress.unused_data
120
127
 
121
128
            # Check the CRC and file size, and set the flag so we read
122
129
            # a new member on the next call
137
144
        # We then check the that the computed CRC and size of the
138
145
        # uncompressed data matches the stored values.  Note that the size
139
146
        # stored is the true file size mod 2**32.
140
 
        crc32, isize = struct.unpack("<LL", self.decompress.unused_data[0:8])
 
147
        assert len(self._gzip_tail) == 8, "gzip trailer is incorrect length."
 
148
        crc32, isize = struct.unpack("<LL", self._gzip_tail)
141
149
        # note that isize is unsigned - it can exceed 2GB
142
150
        if crc32 != U32(self.crc):
143
151
            raise IOError, "CRC check failed %d %d" % (crc32, U32(self.crc))
250
258
        if sizehint <= 0:
251
259
            sizehint = -1
252
260
        content = self.read(sizehint)
253
 
        return content.splitlines(True)
 
261
        return bzrlib.osutils.split_lines(content)
254
262
 
255
263
    def _unread(self, buf, len_buf=None):
256
264
        """tuned to remove unneeded len calls.