Patchwork [V2] webutil: make _siblings into an object with __iter__ and __len__

login
register
mail settings
Submitter Anton Shestakov
Date Nov. 19, 2015, 4:24 a.m.
Message ID <a87bf9c3792302ca976a.1447907043@neuro>
Download mbox | patch
Permalink /patch/11501/
State Accepted
Headers show

Comments

Anton Shestakov - Nov. 19, 2015, 4:24 a.m.
# HG changeset patch
# User Anton Shestakov <av6@dwimlabs.net>
# Date 1447147360 -28800
#      Tue Nov 10 17:22:40 2015 +0800
# Node ID a87bf9c3792302ca976a932099d49af9f144ff3a
# Parent  53c668dc6b1601c8bda5098df4e33030dbdb454d
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.
Pierre-Yves David - Nov. 19, 2015, 6:55 a.m.
On 11/18/2015 08:24 PM, Anton Shestakov wrote:
> # HG changeset patch
> # User Anton Shestakov <av6@dwimlabs.net>
> # Date 1447147360 -28800
> #      Tue Nov 10 17:22:40 2015 +0800
> # Node ID a87bf9c3792302ca976a932099d49af9f144ff3a
> # Parent  53c668dc6b1601c8bda5098df4e33030dbdb454d
> webutil: make _siblings into an object with __iter__ and __len__

This makes sense to me, I've it pushed to the clowncopter.

Patch

diff --git a/mercurial/hgweb/webutil.py b/mercurial/hgweb/webutil.py
--- a/mercurial/hgweb/webutil.py
+++ b/mercurial/hgweb/webutil.py
@@ -125,20 +125,28 @@  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]
+        if len(self.siblings) == 1 and self.siblings[0].rev() == hiderev:
+            self.siblings = []
 
-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):
+        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)
 
 def parents(ctx, hide=None):
     if isinstance(ctx, context.basefilectx):
@@ -355,7 +363,7 @@  def changesetentry(web, req, tmpl, ctx):
         rev=ctx.rev(),
         node=ctx.hex(),
         symrev=symrevorshortnode(req, ctx),
-        parent=tuple(parents(ctx)),
+        parent=parents(ctx),
         child=children(ctx),
         basenode=basectx.hex(),
         changesettag=showtags,