packfile: do not rely on fp.tell()

Summary:
On Windows, fp.tell() might return unreliable data for files with mixed reads
and writes.

Reviewed By: xavierd

Differential Revision: D16035564

fbshipit-source-id: d6cbb018e2664dd1e4323c52e7b0c73df07d7796
This commit is contained in:
Jun Wu 2019-06-27 13:06:05 -07:00 committed by Facebook Github Bot
parent 6ad31bbf6a
commit 64e06423c5
3 changed files with 6 additions and 2 deletions

View File

@ -524,6 +524,7 @@ class mutablebasepack(versionmixin):
self._ui = ui
self._packdir = packdir
self._datalen = 0
self.entries = {}
@ -573,7 +574,10 @@ class mutablebasepack(versionmixin):
self._cleantemppacks()
def writeraw(self, data):
self.packfp.seek(self._datalen, os.SEEK_SET)
assert self.packfp.tell() == self._datalen
self.packfp.write(data)
self._datalen += len(data)
self.sha.update(data)
def close(self):

View File

@ -542,7 +542,7 @@ class mutabledatapack(basepack.mutablebasepack):
if metadata and metadata.get(constants.METAKEYFLAG, 0) != 0:
raise error.ProgrammingError("v0 pack cannot store flags")
offset = self.packfp.tell()
offset = self._datalen
size = len(rawdata)

View File

@ -463,7 +463,7 @@ class mutablehistorypack(basepack.mutablebasepack):
def _write(self):
for filename in sorted(self.fileentries):
entrymap = self.fileentries[filename]
sectionstart = self.packfp.tell()
sectionstart = self._datalen
# Write the file section content
def parentfunc(node):