[PATCH 7 of 9 V4] template: compute dates in obsfatedate

Boris Feld boris.feld at octobus.net
Mon Aug 28 16:06:32 EDT 2017


On Fri, 2017-08-25 at 23:08 +0900, Yuya Nishihara wrote:
> On Wed, 23 Aug 2017 17:18:41 +0200, Boris Feld wrote:
> > # HG changeset patch
> > # User Boris Feld <boris.feld at octobus.net>
> > # Date 1499088850 -7200
> > #      Mon Jul 03 15:34:10 2017 +0200
> > # Node ID b8b8b5bd728a5fb9fa847d56dd489c77a054b5ee
> > # Parent  fc257b24c35c492591f348b039d9e3f9488118a8
> > # EXP-Topic obsfatetemplate
> > template: compute dates in obsfatedate
> > 
> > Extract the dates from obsmarkers. Compute the min and max date
> > from the
> > obsmarker range list.
> > 
> > diff -r fc257b24c35c -r b8b8b5bd728a mercurial/obsutil.py
> > --- a/mercurial/obsutil.py	Mon Jul 03 15:34:00 2017 +0200
> > +++ b/mercurial/obsutil.py	Mon Jul 03 15:34:10 2017 +0200
> > @@ -587,6 +587,11 @@
> >  
> >      return sorted(users)
> >  
> > +def _markersdates(markers):
> > +    """returns the list of dates for a list of markers
> > +    """
> > +    return [m[4] for m in markers]
> > +
> >  def successorsandmarkers(repo, ctx):
> >      """compute the raw data needed for computing obsfate
> >      Returns a list of dict, one dict per successors set
> > diff -r fc257b24c35c -r b8b8b5bd728a mercurial/templater.py
> > --- a/mercurial/templater.py	Mon Jul 03 15:34:00 2017 +0200
> > +++ b/mercurial/templater.py	Mon Jul 03 15:34:10 2017 +0200
> > @@ -888,6 +888,55 @@
> >      data = obsutil._markersusers(markers)
> >      return templatekw._hybrid(None, data, lambda x: x, lambda d:
> > d)
> >  
> > + at templatefunc('obsfatedate(markers)')
> > +def obsfatedate(context, mapping, args):
> > +    """ Compute obsfate related information based on markers
> > +
> > +    (EXPERIMENTAL)
> > +    """
> > +    if not len(args) == 1:
> > +        # i18n: "obsfatedate" is a keyword
> > +        raise error.ParseError(_("obsfatedate expects one
> > arguments"))
> > +
> > +    markers = evalfuncarg(context, mapping, args[0])
> > +    if not isinstance(markers, collections.Iterable):
> > +        # i18n: "obsfatedate" is a keyword
> > +        errmsg = "obsfatedate first argument should be an
> > iterable"
> > +        raise error.ParseError(errmsg)
> > +
> > +    data = obsutil._markersdates(markers)
> > +    return templatekw._hybrid(None, data, lambda x: x, lambda d:
> > d)
> 
> Perhaps, hybridlist() can be used.

I have send a V5 series with modifications according to your
recommendations. Thank you very much for your reviews!

I tried using hybrid list in obsfatedate but it seems to crash because
obsmarker date are tuple. The end of the traceback is:

+    File ".../mercurial/mercurial/templatefilters.py", line 360, in
stringify
+      return "".join([stringify(t) for t in thing if t is not None])
+    File ".../mercurial/mercurial/templatekw.py", line 55, in
_defaultgen
+      yield self.joinfmt(d)
+    File ".../mercurial/mercurial/templatekw.py", line 81, in <lambda>
+      return _hybrid(gen, data, lambda x: {name: x}, lambda d: fmt %
d[name])
+  TypeError: not all arguments converted during string formatting
+  [1]

It seems to be because of joinfmt and I'm not sure what would be the
best way to workaround.

> 
> > + at templatefunc('min(iterable)')
> > +def tmplmin(context, mapping, args, **kwargs):
> 
> Nit: the other functions are named as if_, dict_, etc., and roughly
> sorted
> alphabetically.
> 
> > +    """ Return the min of an iterable
> > +    """
> > +    if not len(args) == 1:
> > +        # i18n: "min" is a keyword
> > +        raise error.ParseError(_("min expects one arguments"))
> > +
> > +    iterable = evalfuncarg(context, mapping, args[0])
> > +    if not isinstance(iterable, collections.Iterable):
> > +        # i18n: "obsfatedate" is a keyword
> 
>                    ^^^^^^^^^^^^^
> Outdated comment.
> 
> > +        raise error.ParseError(_("min first argument should be an
> > iterable"))
> > +
> > +    return min(iterable)
> 
> An empty list is also invalid. Perhaps we can catch TypeError and
> ValueError instead of testing if the argument is an iterable.


More information about the Mercurial-devel mailing list