# HG changeset patch # User Anton Shestakov # Date 1617104152 -28800 # Node ID d7ed8881045711f9e3a76162c57fb32dad2612a0 # Parent 97f5b5b25299602ba6171eee02ef9578fdd4a607 evolve: make firstmergecache.save/load use struct.unpack/pack (issue6354) arraytobytes() and arrayfrombytes() is not cross-platform. diff -r 97f5b5b25299 -r d7ed88810457 hgext3rd/evolve/firstmergecache.py --- a/hgext3rd/evolve/firstmergecache.py Wed Mar 31 20:13:31 2021 +0800 +++ b/hgext3rd/evolve/firstmergecache.py Tue Mar 30 19:35:52 2021 +0800 @@ -129,20 +129,23 @@ assert repo.filtername is None data = repo.cachevfs.tryread(self._filepath) + self._cachekey = self.emptykey self._data = array.array(r'l') - if not data: - self._cachekey = self.emptykey - else: + if data: headerdata = data[:self._cachekeysize] - self._cachekey = self._deserializecachekey(headerdata) - compat.arrayfrombytes(self._data, data[self._cachekeysize:]) + cachekey = self._deserializecachekey(headerdata) + expected = self._datastruct.size * (cachekey[0] + 1) + data = data[self._cachekeysize:] + if len(data) == expected: + self._data.extend(self._deserializedata(data)) + self._cachekey = cachekey + else: + repo.ui.debug(b'firstmergecache file seems to be corrupted, ' + b'it will be rebuilt from scratch\n') self._ondiskkey = self._cachekey def save(self, repo): """save the data to disk - - Format is pretty simple, we serialise the cache key and then drop the - bytearray. """ if self._cachekey is None or self._cachekey == self._ondiskkey: return @@ -151,7 +154,7 @@ cachefile = repo.cachevfs(self._filepath, b'w', atomictemp=True) headerdata = self._serializecachekey() cachefile.write(headerdata) - cachefile.write(compat.arraytobytes(self._data)) + cachefile.write(self._serializedata(self._data)) cachefile.close() self._ondiskkey = self._cachekey except (IOError, OSError) as exc: diff -r 97f5b5b25299 -r d7ed88810457 tests/test-discovery-obshashrange-cache.t --- a/tests/test-discovery-obshashrange-cache.t Wed Mar 31 20:13:31 2021 +0800 +++ b/tests/test-discovery-obshashrange-cache.t Tue Mar 30 19:35:52 2021 +0800 @@ -292,6 +292,46 @@ f69452c5b1af -1 4de32a90b66c -1 + $ "$PYTHON" repack.py main/.hg/cache/evoext-firstmerge-00 + $ f -H main/.hg/cache/evoext-firstmerge-00 + main/.hg/cache/evoext-firstmerge-00: + 0000: 00 00 00 07 4d e3 2a 90 b6 6c d0 83 eb f3 c0 0b |....M.*..l......| + 0010: 41 27 7a a7 ab ca 51 dd ff ff ff ff ff ff ff ff |A'z...Q.........| + 0020: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| + 0030: ff ff ff ff ff ff ff ff |........| + + $ hg -R main debugfirstmergecache --debug + firstmergecache file seems to be corrupted, it will be rebuilt from scratch + 1ea73414a91b -1 + 66f7d451a68b -1 + 01241442b3c2 -1 + 2dc09a01254d -1 + bebd167eb94d -1 + c8d03c1b5e94 -1 + f69452c5b1af -1 + 4de32a90b66c -1 + + $ "$PYTHON" truncate.py main/.hg/cache/evoext-firstmerge-00 -4 + $ f -H main/.hg/cache/evoext-firstmerge-00 + main/.hg/cache/evoext-firstmerge-00: + 0000: 00 00 00 07 4d e3 2a 90 b6 6c d0 83 eb f3 c0 0b |....M.*..l......| + 0010: 41 27 7a a7 ab ca 51 dd ff ff ff ff ff ff ff ff |A'z...Q.........| + 0020: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| + 0030: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| + 0040: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| + 0050: ff ff ff ff |....| + + $ hg -R main debugfirstmergecache --debug + firstmergecache file seems to be corrupted, it will be rebuilt from scratch + 1ea73414a91b -1 + 66f7d451a68b -1 + 01241442b3c2 -1 + 2dc09a01254d -1 + bebd167eb94d -1 + c8d03c1b5e94 -1 + f69452c5b1af -1 + 4de32a90b66c -1 + $ hg -R main debugstablesortcache --debug number of revisions: 8 number of merge: 0