558
558
def get_diff(self, version_id):
559
559
start, count = self._diff_offset[version_id]
560
infile = open(self._filename + '.mpknit', 'rb')
560
with open(self._filename + '.mpknit', 'rb') as infile:
562
561
infile.seek(start)
563
562
sio = BytesIO(infile.read(count))
566
zip_file = gzip.GzipFile(None, mode='rb', fileobj=sio)
563
with gzip.GzipFile(None, mode='rb', fileobj=sio) as zip_file:
568
564
file_version_id = zip_file.readline()
569
565
content = zip_file.read()
570
566
return MultiParent.from_patch(content)
574
568
def add_diff(self, diff, version_id, parent_ids):
575
outfile = open(self._filename + '.mpknit', 'ab')
569
with open(self._filename + '.mpknit', 'ab') as outfile:
577
570
outfile.seek(0, 2) # workaround for windows bug:
578
571
# .tell() for files opened in 'ab' mode
579
572
# before any write returns 0
580
573
start = outfile.tell()
582
zipfile = gzip.GzipFile(None, mode='ab', fileobj=outfile)
574
with gzip.GzipFile(None, mode='ab', fileobj=outfile) as zipfile:
583
575
zipfile.writelines(itertools.chain(
584
576
['version %s\n' % version_id], diff.to_patch()))
587
577
end = outfile.tell()
590
578
self._diff_offset[version_id] = (start, end-start)
591
579
self._parents[version_id] = parent_ids
677
665
def gzip_string(lines):
679
data_file = gzip.GzipFile(None, mode='wb', fileobj=sio)
680
data_file.writelines(lines)
667
with gzip.GzipFile(None, mode='wb', fileobj=sio) as data_file:
668
data_file.writelines(lines)
682
669
return sio.getvalue()