[PATCH] revset: fix iteration over ordered addset composed of non-ordered operant

Yuya Nishihara yuya at tcha.org
Fri May 15 07:38:42 CDT 2015


On Fri, 15 May 2015 01:29:25 -0700, Pierre-Yves David wrote:
> # HG changeset patch
> # User Pierre-Yves David <pierre-yves.david at fb.com>
> # Date 1431674743 25200
> #      Fri May 15 00:25:43 2015 -0700
> # Node ID c1b2704abcd0dd81c7f29d1fc21e017665e0941c
> # Parent  d1bd0fd07ee6adf4ab3be2b0a0a7c0df54d55abf
> revset: fix iteration over ordered addset composed of non-ordered operant
> 
> Before this change, doing ordered iteration over an 'addset' object composed of
> operant without fastasc or fastdesc method could result into duplicated entry.
> This was the result of applying '_iterordered' on non ordered set.
> 
> We fix it by ensuring we iterate over the set in a sorted order. Using the fast
> iterator when it exists on any operand. We kill the '_iterator' method in the
> process because it did not made a lot of sense independently.
[...]
> +        # try to use our own fast iterator if it exists
>          self._trysetasclist()
>          if self._ascending:
>              it = self.fastasc
>          else:
>              it = self.fastdesc
> -        if it is None:
> -            # consume the gen and try again
> -            self._list
> -            return iter(self)
> -        return it()
> +        if it is not None:
> +            return it()
> +        # maybe half of the component supports fast
> +        attr = 'fastdesc'
> +        if self._ascending:
> +            attr = 'fastasc'
> +        # get iterator for _r1
> +        iter1 = getattr(self._r1, attr)
> +        if iter1 is None:
> +            # let's avoid side effect (not sure it matters)
> +            iter1 = iter(sorted(self._r1, reverse=not self._ascending))
> +        else:
> +            iter1 = iter1()
> +        # get iterator for _r2
> +        iter2 = getattr(self._r2, attr)
> +        if iter2 is None:
> +            # let's avoid side effect (not sure it matters)
> +            iter2 = iter(sorted(self._r2, reverse=not self._ascending))
> +        else:
> +            iter2 = iter2()
> +        return self._iterordered(self._ascending, iter1, iter2)

LGTM, thanks for fixing it.

Can you pick "[PATCH 4 of 6] revset: drop redundant filteredset from right-hand
side set of "or" operation" from my previous series? I think it's okay.
I'll rewrite the other patches.

Regards,


More information about the Mercurial-devel mailing list