diff -r 4c885d5ff132 -r 76416b6e9d9b mercurial/branching/rev_cache.py --- a/mercurial/branching/rev_cache.py Fri Sep 27 15:01:43 2024 +0200 +++ b/mercurial/branching/rev_cache.py Fri Sep 27 15:19:10 2024 +0200 @@ -56,23 +56,28 @@ self._prefix = revs self._rest = bytearray() + @property + def len_prefix(self): + size = len(self._prefix) + return size - (size % _rbcrecsize) + def __len__(self): - return len(self._prefix) + len(self._rest) + return self.len_prefix + len(self._rest) def unpack_record(self, rbcrevidx): - if rbcrevidx < len(self._prefix): + if rbcrevidx < self.len_prefix: return unpack_from(_rbcrecfmt, util.buffer(self._prefix), rbcrevidx) else: return unpack_from( _rbcrecfmt, util.buffer(self._rest), - rbcrevidx - len(self._prefix), + rbcrevidx - self.len_prefix, ) def make_mutable(self): - if len(self._prefix) > 0: + if self.len_prefix > 0: entirety = bytearray() - entirety[:] = self._prefix + entirety[:] = self._prefix[: self.len_prefix] entirety.extend(self._rest) self._rest = entirety self._prefix = bytearray() @@ -82,10 +87,10 @@ del self._rest[pos:] def pack_into(self, rbcrevidx, node, branchidx): - if rbcrevidx < len(self._prefix): + if rbcrevidx < self.len_prefix: self.make_mutable() buf = self._rest - start_offset = rbcrevidx - len(self._prefix) + start_offset = rbcrevidx - self.len_prefix end_offset = start_offset + _rbcrecsize if len(self._rest) < end_offset: @@ -107,14 +112,14 @@ return self._rest.extend(extension) def slice(self, begin, end): - if begin < len(self._prefix): + if begin < self.len_prefix: acc = bytearray() - acc[:] = self._prefix[begin:end] + acc[:] = self._prefix[begin : min(end, self.len_prefix)] acc.extend( - self._rest[begin - len(self._prefix) : end - len(self._prefix)] + self._rest[begin - self.len_prefix : end - self.len_prefix] ) return acc - return self._rest[begin - len(self._prefix) : end - len(self._prefix)] + return self._rest[begin - self.len_prefix : end - self.len_prefix] class revbranchcache: @@ -388,6 +393,9 @@ if self._force_overwrite: start = 0 + # align start on entry boundary + start = _rbcrecsize * (start // _rbcrecsize) + with repo.cachevfs.open(_rbcrevs, b'a+b') as f: pass # this make sure the file exist… with repo.cachevfs.open(_rbcrevs, b'r+b') as f: