# HG changeset patch # User Wojciech Lopata # Date 2013-09-20 17:45:51 # Node ID e92650e39f1cd8ff7565c583e8bf0fa0bdac364d # Parent 478f3379768aecf737fed585f4b4de373784cabf generaldelta: initialize basecache properly Previously basecache was incorrectly initialized before adding the first revision from a changegroup. Basecache value influences when full revisions are stored in revlog (when using generaldelta). As a result it was possible to generate a generaldelta-revlog that could be bigger by arbitrary factor than its non-generaldelta equivalent. diff --git a/mercurial/revlog.py b/mercurial/revlog.py --- a/mercurial/revlog.py +++ b/mercurial/revlog.py @@ -200,7 +200,7 @@ class revlog(object): self.datafile = indexfile[:-2] + ".d" self.opener = opener self._cache = None - self._basecache = (0, 0) + self._basecache = None self._chunkcache = (0, '') self.index = [] self._pcache = {} @@ -1095,6 +1095,8 @@ class revlog(object): offset = self.end(prev) flags = 0 d = None + if self._basecache is None: + self._basecache = (prev, self.chainbase(prev)) basecache = self._basecache p1r, p2r = self.rev(p1), self.rev(p2) diff --git a/tests/test-generaldelta.t b/tests/test-generaldelta.t new file mode 100755 --- /dev/null +++ b/tests/test-generaldelta.t @@ -0,0 +1,23 @@ +Check whether size of generaldelta revlog is not bigger than its +regular equivalent. Test would fail if generaldelta was naive +implementation of parentdelta: third manifest revision would be fully +inserted due to big distance from its paren revision (zero). + + $ hg init repo + $ cd repo + $ echo foo > foo + $ echo bar > bar + $ hg commit -q -Am boo + $ hg clone --pull . ../gdrepo -q --config format.generaldelta=yes + $ for r in 1 2 3; do + > echo $r > foo + > hg commit -q -m $r + > hg up -q -r 0 + > hg pull . -q -r $r -R ../gdrepo + > done + $ cd .. + $ regsize=`du -s -b repo/.hg/store/00manifest.i | cut -f 1` + $ gdsize=`du -s -b gdrepo/.hg/store/00manifest.i | cut -f 1` + $ if ((regsize < gdsize)); then + > echo 'generaldelta increased size of a revlog!' + > fi