Re: [PATCH 7 of 7] hgweb: convert _siblings to a factory function of mappinggenerator

2018-04-15 Thread Yuya Nishihara
On Sun, 15 Apr 2018 14:06:03 +0800, Anton Shestakov wrote:
> On Sat, 14 Apr 2018 21:49:17 +0900
> Yuya Nishihara  wrote:
> 
> > -class _siblings(object):
> > -def __init__(self, siblings=None, hiderev=None):
> > -if siblings is None:
> > -siblings = []
> > -self.siblings = [s for s in siblings if s.node() != nullid]
> > -if len(self.siblings) == 1 and self.siblings[0].rev() == hiderev:
> > -self.siblings = []
> > -
> > -def __iter__(self):
> > -return _ctxsgen(self.siblings)
> > -
> > -def __len__(self):
> > -return len(self.siblings)
> > +def _siblings(siblings=None, hiderev=None):
> > +if siblings is None:
> > +siblings = []
> > +siblings = [s for s in siblings if s.node() != nullid]
> > +if len(siblings) == 1 and siblings[0].rev() == hiderev:
> > +siblings = []
> > +return templateutil.mappinggenerator(_ctxsgen, args=(siblings,))
> 
> One thing that this patch makes difficult to understand is how you can't
> now say len(parents):
> 
>   TypeError: object of type 'mappinggenerator' has no len()
> 
> ... but "{count(parents)}" in the templates works as expected, even
> though count template filter simply does len(i).

Filter functions receive an inner value, in which case, it is a list of dicts.

Basically I threw away the idea behind the hybrid class, which is to provide
all required behaviors by a single object as if it were a plain Python object.
It didn't work. Instead, a wrapped class can be considered a container like
Maybe type. It returns some meaningful values depending on what is expected by
caller.
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


Re: [PATCH 7 of 7] hgweb: convert _siblings to a factory function of mappinggenerator

2018-04-14 Thread Anton Shestakov
On Sat, 14 Apr 2018 21:49:17 +0900
Yuya Nishihara  wrote:

> -class _siblings(object):
> -def __init__(self, siblings=None, hiderev=None):
> -if siblings is None:
> -siblings = []
> -self.siblings = [s for s in siblings if s.node() != nullid]
> -if len(self.siblings) == 1 and self.siblings[0].rev() == hiderev:
> -self.siblings = []
> -
> -def __iter__(self):
> -return _ctxsgen(self.siblings)
> -
> -def __len__(self):
> -return len(self.siblings)
> +def _siblings(siblings=None, hiderev=None):
> +if siblings is None:
> +siblings = []
> +siblings = [s for s in siblings if s.node() != nullid]
> +if len(siblings) == 1 and siblings[0].rev() == hiderev:
> +siblings = []
> +return templateutil.mappinggenerator(_ctxsgen, args=(siblings,))

One thing that this patch makes difficult to understand is how you can't
now say len(parents):

  TypeError: object of type 'mappinggenerator' has no len()

... but "{count(parents)}" in the templates works as expected, even
though count template filter simply does len(i).
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


Re: [PATCH 7 of 7] hgweb: convert _siblings to a factory function of mappinggenerator

2018-04-14 Thread Anton Shestakov
On Sat, 14 Apr 2018 21:49:17 +0900
Yuya Nishihara  wrote:

> # HG changeset patch
> # User Yuya Nishihara 
> # Date 1522594234 -32400
> #  Sun Apr 01 23:50:34 2018 +0900
> # Node ID fe959b32685068231cad8ef26387c7c16fe0961a
> # Parent  8e479b1d96bf94e81f76c78605c16b2864b219a5
> hgweb: convert _siblings to a factory function of mappinggenerator

Queued, thanks!
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


[PATCH 7 of 7] hgweb: convert _siblings to a factory function of mappinggenerator

2018-04-14 Thread Yuya Nishihara
# HG changeset patch
# User Yuya Nishihara 
# Date 1522594234 -32400
#  Sun Apr 01 23:50:34 2018 +0900
# Node ID fe959b32685068231cad8ef26387c7c16fe0961a
# Parent  8e479b1d96bf94e81f76c78605c16b2864b219a5
hgweb: convert _siblings to a factory function of mappinggenerator

IIUC, only reason it was a class is to make the generator restartable,
which is now served by the mappinggenerator.

diff --git a/mercurial/hgweb/webutil.py b/mercurial/hgweb/webutil.py
--- a/mercurial/hgweb/webutil.py
+++ b/mercurial/hgweb/webutil.py
@@ -183,7 +183,7 @@ class filerevnav(revnav):
 
 # TODO: maybe this can be a wrapper class for changectx/filectx list, which
 # yields {'ctx': ctx}
-def _ctxsgen(ctxs):
+def _ctxsgen(context, ctxs):
 for s in ctxs:
 d = {
 'node': s.hex(),
@@ -197,19 +197,13 @@ def _ctxsgen(ctxs):
 d['file'] = s.path()
 yield d
 
-class _siblings(object):
-def __init__(self, siblings=None, hiderev=None):
-if siblings is None:
-siblings = []
-self.siblings = [s for s in siblings if s.node() != nullid]
-if len(self.siblings) == 1 and self.siblings[0].rev() == hiderev:
-self.siblings = []
-
-def __iter__(self):
-return _ctxsgen(self.siblings)
-
-def __len__(self):
-return len(self.siblings)
+def _siblings(siblings=None, hiderev=None):
+if siblings is None:
+siblings = []
+siblings = [s for s in siblings if s.node() != nullid]
+if len(siblings) == 1 and siblings[0].rev() == hiderev:
+siblings = []
+return templateutil.mappinggenerator(_ctxsgen, args=(siblings,))
 
 def difffeatureopts(req, ui, section):
 diffopts = patch.difffeatureopts(ui, untrusted=True,
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel