[PATCH 1 of 3] webutil: make _siblings into an object with __iter__ and __len__

Yuya Nishihara yuya at tcha.org
Wed Nov 18 07:49:56 CST 2015


On Tue, 17 Nov 2015 21:33:56 +0800, Anton Shestakov wrote:
> # HG changeset patch
> # User Anton Shestakov <av6 at dwimlabs.net>
> # Date 1447147360 -28800
> #      Tue Nov 10 17:22:40 2015 +0800
> # Node ID f6968049b048311f60d496f3c899e58fb649d884
> # Parent  2da6a2dbfc42bdec4bcaf47da947c64ff959a59c
> webutil: make _siblings into an object with __iter__ and __len__
> 
> _siblings is a helper that is used for displaying changeset parents and
> children in hgweb. Before, when it was a simple generator, it couldn't tell its
> length without being consumed, and that required a special case when preparing
> data for changeset template (see 9e1f4c65f5f5).
> 
> Let's make it into a class (similar to templatekw._hybrid) that allows len(...)
> without side-effects.
> 
> diff --git a/mercurial/hgweb/webutil.py b/mercurial/hgweb/webutil.py
> --- a/mercurial/hgweb/webutil.py
> +++ b/mercurial/hgweb/webutil.py
> @@ -124,20 +124,29 @@ class filerevnav(revnav):
>      def hex(self, rev):
>          return hex(self._changelog.node(self._revlog.linkrev(rev)))
>  
> +class _siblings(object):
> +    def __init__(self, siblings=[], hiderev=None):
> +        self.siblings = [s for s in siblings if s.node() != nullid]
> +        self.hiderev = hiderev
>  
> -def _siblings(siblings=[], hiderev=None):
> -    siblings = [s for s in siblings if s.node() != nullid]
> -    if len(siblings) == 1 and siblings[0].rev() == hiderev:
> -        return
> -    for s in siblings:
> -        d = {'node': s.hex(), 'rev': s.rev()}
> -        d['user'] = s.user()
> -        d['date'] = s.date()
> -        d['description'] = s.description()
> -        d['branch'] = s.branch()
> -        if util.safehasattr(s, 'path'):
> -            d['file'] = s.path()
> -        yield d
> +    def __iter__(self):
> +        if len(self) == 1 and self.siblings[0].rev() == self.hiderev:
> +            return
> +        for s in self.siblings:
> +            d = {
> +                'node': s.hex(),
> +                'rev': s.rev(),
> +                'user': s.user(),
> +                'date': s.date(),
> +                'description': s.description(),
> +                'branch': s.branch(),
> +            }
> +            if util.safehasattr(s, 'path'):
> +                d['file'] = s.path()
> +            yield d
> +
> +    def __len__(self):
> +        return len(self.siblings)

If siblings[0] is hiderev, len() should be 0.


More information about the Mercurial-devel mailing list