From 64e06423c5522a2cbadbb93673d07f90010484f8 Mon Sep 17 00:00:00 2001 From: Jun Wu Date: Thu, 27 Jun 2019 13:06:05 -0700 Subject: [PATCH] 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 --- edenscm/hgext/remotefilelog/basepack.py | 4 ++++ edenscm/hgext/remotefilelog/datapack.py | 2 +- edenscm/hgext/remotefilelog/historypack.py | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/edenscm/hgext/remotefilelog/basepack.py b/edenscm/hgext/remotefilelog/basepack.py index c9b8218250..968b75c43d 100644 --- a/edenscm/hgext/remotefilelog/basepack.py +++ b/edenscm/hgext/remotefilelog/basepack.py @@ -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): diff --git a/edenscm/hgext/remotefilelog/datapack.py b/edenscm/hgext/remotefilelog/datapack.py index e230379357..9a8cfe7ed7 100644 --- a/edenscm/hgext/remotefilelog/datapack.py +++ b/edenscm/hgext/remotefilelog/datapack.py @@ -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) diff --git a/edenscm/hgext/remotefilelog/historypack.py b/edenscm/hgext/remotefilelog/historypack.py index e877c13698..89084d463b 100644 --- a/edenscm/hgext/remotefilelog/historypack.py +++ b/edenscm/hgext/remotefilelog/historypack.py @@ -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):