[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