diff -r 89d44cfcdeeb -r f5a7cf0adb12 mercurial/tags.py --- a/mercurial/tags.py Fri Feb 07 15:55:26 2020 -0500 +++ b/mercurial/tags.py Fri Feb 07 16:01:32 2020 -0500 @@ -720,15 +720,18 @@ self._dirtyoffset = None - if rawlen < wantedlen: - self._dirtyoffset = rawlen - self._raw.extend(b'\xff' * (wantedlen - rawlen)) - elif rawlen > wantedlen: + rawlentokeep = min(wantedlen, (rawlen / _fnodesrecsize) * _fnodesrecsize) + if rawlen > rawlentokeep: # There's no easy way to truncate array instances. This seems # slightly less evil than copying a potentially large array slice. - for i in range(rawlen - wantedlen): + for i in range(rawlen - rawlentokeep): self._raw.pop() - self._dirtyoffset = len(self._raw) + rawlen = len(self._raw) + self._dirtyoffset = rawlen + if rawlen < wantedlen: + if self._dirtyoffset is None: + self._dirtyoffset = rawlen + self._raw.extend(b'\xff' * (wantedlen - rawlen)) def getfnode(self, node, computemissing=True): """Obtain the filenode of the .hgtags file at a specified revision.