# HG changeset patch # User Pierre-Yves David # Date 2014-11-13 11:11:17 # Node ID 47091002ae622a9450cebe586b9d8efc28f04a61 # Parent a179db3db9b96b38c10c491e6e7e7ad5f40a7787 repoview: extract actual hidden cache writing in its own function This will allow the generation of this cache within the transaction. Relying on the transaction will reduce the chance of reader seeing bad cache. diff --git a/mercurial/repoview.py b/mercurial/repoview.py --- a/mercurial/repoview.py +++ b/mercurial/repoview.py @@ -72,6 +72,13 @@ def cachehash(repo, hideable): h.update(str(hash(frozenset(hideable)))) return h.digest() +def _writehiddencache(cachefile, cachehash, hidden): + """write hidden data to a cache file""" + data = struct.pack('>%ii' % len(hidden), *sorted(hidden)) + cachefile.write(struct.pack(">H", cacheversion)) + cachefile.write(cachehash) + cachefile.write(data) + def trywritehiddencache(repo, hideable, hidden): """write cache of hidden changesets to disk @@ -87,12 +94,8 @@ def trywritehiddencache(repo, hideable, wlock = repo.wlock(wait=False) # write cache to file newhash = cachehash(repo, hideable) - sortedset = sorted(hidden) - data = struct.pack('>%ii' % len(sortedset), *sortedset) fh = repo.vfs.open(cachefile, 'w+b', atomictemp=True) - fh.write(struct.pack(">H", cacheversion)) - fh.write(newhash) - fh.write(data) + _writehiddencache(fh, newhash, hidden) except (IOError, OSError): repo.ui.debug('error writing hidden changesets cache') except error.LockHeld: