[PATCH] revset: rework 'filteredset.last'

Yuya Nishihara yuya at tcha.org
Tue Jun 23 09:37:15 CDT 2015


On Mon, 22 Jun 2015 14:57:30 -0700, Pierre-Yves David wrote:
> # HG changeset patch
> # User Pierre-Yves David <pierre-yves.david at fb.com>
> # Date 1435006081 25200
> #      Mon Jun 22 13:48:01 2015 -0700
> # Node ID 5436ea241ec1c12294d7868de6c679d10d333060
> # Parent  7fdd1782fc4ee9da87d8af13e806dc9055db2c38
> revset: rework 'filteredset.last'
> 
> As 'isascending' and 'isdescending' are method, not attribute. This led 'last()'
> to misbehave on some non-ascending filtered set.
> 
> diff --git a/mercurial/revset.py b/mercurial/revset.py
> --- a/mercurial/revset.py
> +++ b/mercurial/revset.py
> @@ -3022,20 +3022,22 @@ class filteredset(abstractsmartset):
>              return x
>          return None
>  
>      def last(self):
>          it = None
> -        if self._subset.isascending:
> +        if self.isascending():
>              it = self.fastdesc
> -        elif self._subset.isdescending:
> -            it = self.fastdesc
> -        if it is None:
> -            # slowly consume everything. This needs improvement
> -            it = lambda: reversed(list(self))
> -        for x in it():
> +        elif self.isdescending():
> +            it = self.fastasc
> +        if it is not None:
> +            for x in it():
> +                return x
> +        else:

> +            for x in self:
> +                pass
>              return x

It will fail if self is empty.

>>> revset.filteredset(revset.generatorset([])).last()
...
UnboundLocalError: local variable 'x' referenced before assignment


More information about the Mercurial-devel mailing list