[PATCH 2 of 3] revlog: calculate base revisions iteratively
Benoit Boissinot
bboissin at gmail.com
Thu May 5 04:07:15 CDT 2011
On Wed, May 4, 2011 at 11:42 PM, Sune Foldager <cryo at cyanite.org> wrote:
> # HG changeset patch
> # User Sune Foldager <cryo at cyanite.org>
> # Date 1304544519 -7200
> # Node ID 39f6e0127ff15c5ad82b989d387402ec83ea30d4
> # Parent be4a52cc2fe9b982dbec4a44809481e41b9cbe29
> revlog: calculate base revisions iteratively
>
> This is in preparation for generaldelta, where the revlog entry base field
> is reinterpreted as the deltaparent.
>
> Performance is virtually unchanged, as there can be at most two iterations.
>
Might be nice to have numbers (with perf.py). Otherwise looks good
besides the loss in readability (from using e[3], that's where named
tuples might have been nice).
Benoit
> diff --git a/mercurial/revlog.py b/mercurial/revlog.py
> --- a/mercurial/revlog.py
> +++ b/mercurial/revlog.py
> @@ -325,7 +325,12 @@
> def length(self, rev):
> return self.index[rev][1]
> def base(self, rev):
> - return self.index[rev][3]
> + index = self.index
> + e = index[rev]
> + while e[3] != rev:
> + rev = e[3]
> + e = index[rev]
> + return rev
> def flags(self, rev):
> return self.index[rev][0] & 0xFFFF
> def rawsize(self, rev):
> @@ -867,7 +872,6 @@
> # look up what we need to read
> text = None
> rev = self.rev(node)
> - base = self.base(rev)
>
> # check rev flags
> if self.flags(rev) & ~REVIDX_KNOWN_FLAGS:
> @@ -879,7 +883,7 @@
> index = self.index # for performance
> iterrev = rev
> e = index[iterrev]
> - while iterrev != base and iterrev != cachedrev:
> + while iterrev != e[3] and iterrev != cachedrev:
I don't remember now, have you checked that we've always have
base(rev) = base(base(rev)) throughout our history?
Benoit
More information about the Mercurial-devel
mailing list