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 3468fd599ef4).

Let's make it into a class (similar to templatekw._hybrid) that allows len(...)
without side-effects.
This commit is contained in:
Anton Shestakov 2015-11-10 17:22:40 +08:00
parent a19a04c7f9
commit 53412195f4

View File

@ -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,