Patchwork [1,of,2] templates: add whyunstable template keyword

login
register
mail settings
Submitter Anton Shestakov
Date April 14, 2018, 11:43 a.m.
Message ID <987c05eac1801d0b919c.1523706195@neuro>
Download mbox | patch
Permalink /patch/31015/
State Accepted
Headers show

Comments

Anton Shestakov - April 14, 2018, 11:43 a.m.
# HG changeset patch
# User Anton Shestakov <av6@dwimlabs.net>
# Date 1522054812 -28800
#      Mon Mar 26 17:00:12 2018 +0800
# Node ID 987c05eac1801d0b919c874280d03f9e8cccb411
# Parent  8bacc09814ba5500d15fb40c472e84cb95ae2f99
templates: add whyunstable template keyword
Yuya Nishihara - April 14, 2018, 12:03 p.m.
On Sat, 14 Apr 2018 19:43:15 +0800, Anton Shestakov wrote:
> # HG changeset patch
> # User Anton Shestakov <av6@dwimlabs.net>
> # Date 1522054812 -28800
> #      Mon Mar 26 17:00:12 2018 +0800
> # Node ID 987c05eac1801d0b919c874280d03f9e8cccb411
> # Parent  8bacc09814ba5500d15fb40c472e84cb95ae2f99
> templates: add whyunstable template keyword

Queued, thanks.

> +@templatekeyword('whyunstable', requires={'repo', 'ctx'})
> +def showwhyunstable(context, mapping):
> +    """List of dicts explaining all instabilities of a changeset.
> +    (EXPERIMENTAL)
> +    """
> +    repo = context.resource(mapping, 'repo')
> +    ctx = context.resource(mapping, 'ctx')
> +
> +    def formatnode(ctx):
> +        return ' %s (%s)' % (scmutil.formatchangeid(ctx), ctx.phasestr())

Nit: leading ' ' isn't nice when you join() the list.

> +    for entry in entries:
> +        if entry.get('divergentnodes'):
> +            dnodes = entry['divergentnodes']
> +            entry['divergentnodes'] = ''.join(formatnode(dnode)
> +                                              for dnode in dnodes)

Perhaps this can be a hybrid list. Can you send a follow up?

    _hybrid(None, [c.hex() for c in dnodes],
            lambda x: {'ctx': repo[x]},
            lambda x: formatnode(repo[c]))

(We don't have a wrapper for a list of ctx objects yet.)
Anton Shestakov - April 14, 2018, 12:50 p.m.
On Sat, 14 Apr 2018 21:03:23 +0900
Yuya Nishihara <yuya@tcha.org> wrote:

> On Sat, 14 Apr 2018 19:43:15 +0800, Anton Shestakov wrote:
> > # HG changeset patch
> > # User Anton Shestakov <av6@dwimlabs.net>
> > # Date 1522054812 -28800
> > #      Mon Mar 26 17:00:12 2018 +0800
> > # Node ID 987c05eac1801d0b919c874280d03f9e8cccb411
> > # Parent  8bacc09814ba5500d15fb40c472e84cb95ae2f99
> > templates: add whyunstable template keyword  
> 
> Queued, thanks.
> 
> > +@templatekeyword('whyunstable', requires={'repo', 'ctx'})
> > +def showwhyunstable(context, mapping):
> > +    """List of dicts explaining all instabilities of a changeset.
> > +    (EXPERIMENTAL)
> > +    """
> > +    repo = context.resource(mapping, 'repo')
> > +    ctx = context.resource(mapping, 'ctx')
> > +
> > +    def formatnode(ctx):
> > +        return ' %s (%s)' % (scmutil.formatchangeid(ctx), ctx.phasestr())  
> 
> Nit: leading ' ' isn't nice when you join() the list.

I was trying to avoid something like '{if(divergentnodes, " ")}', but
maybe it wouldn't be too bad. I'll come back to this tomorrow.
Yuya Nishihara - April 14, 2018, 10:26 p.m.
On Sat, 14 Apr 2018 20:50:19 +0800, Anton Shestakov wrote:
> On Sat, 14 Apr 2018 21:03:23 +0900
> Yuya Nishihara <yuya@tcha.org> wrote:
> > > +    def formatnode(ctx):
> > > +        return ' %s (%s)' % (scmutil.formatchangeid(ctx), ctx.phasestr())  
> > 
> > Nit: leading ' ' isn't nice when you join() the list.
> 
> I was trying to avoid something like '{if(divergentnodes, " ")}', but
> maybe it wouldn't be too bad. I'll come back to this tomorrow.

'{separate(' ', blah, blah, ...)}' could be used instead of if().

Patch

diff --git a/mercurial/templatekw.py b/mercurial/templatekw.py
--- a/mercurial/templatekw.py
+++ b/mercurial/templatekw.py
@@ -793,6 +793,28 @@  def showverbosity(context, mapping):
         return 'verbose'
     return ''
 
+@templatekeyword('whyunstable', requires={'repo', 'ctx'})
+def showwhyunstable(context, mapping):
+    """List of dicts explaining all instabilities of a changeset.
+    (EXPERIMENTAL)
+    """
+    repo = context.resource(mapping, 'repo')
+    ctx = context.resource(mapping, 'ctx')
+
+    def formatnode(ctx):
+        return ' %s (%s)' % (scmutil.formatchangeid(ctx), ctx.phasestr())
+
+    entries = obsutil.whyunstable(repo, ctx)
+
+    for entry in entries:
+        if entry.get('divergentnodes'):
+            dnodes = entry['divergentnodes']
+            entry['divergentnodes'] = ''.join(formatnode(dnode)
+                                              for dnode in dnodes)
+
+    tmpl = '{instability}:{divergentnodes} {reason} {node|short}'
+    return templateutil.mappinglist(entries, tmpl=tmpl, sep='\n')
+
 def loadkeyword(ui, extname, registrarobj):
     """Load template keyword from specified registrarobj
     """
diff --git a/tests/test-obsolete-divergent.t b/tests/test-obsolete-divergent.t
--- a/tests/test-obsolete-divergent.t
+++ b/tests/test-obsolete-divergent.t
@@ -721,6 +721,11 @@  Use scmutil.cleanupnodes API to create d
   $ hg debugwhyunstable 1a2a9b5b0030
   content-divergent: 70d5a63ca112acb3764bc1d7320ca90ea688d671 (draft) predecessor a178212c3433c4e77b573f6011e29affb8aefa33
 
+  $ hg log -r 1a2a9b5b0030 --hidden -T '{whyunstable}\n'
+  content-divergent: 4:70d5a63ca112 (draft) predecessor a178212c3433
+  $ hg log -r 1a2a9b5b0030 --hidden -T '{whyunstable%"{instability}:{divergentnodes} {reason} {node}\n"}'
+  content-divergent: 4:70d5a63ca112 (draft) predecessor a178212c3433c4e77b573f6011e29affb8aefa33
+
 #if serve
 
   $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
diff --git a/tests/test-obsolete.t b/tests/test-obsolete.t
--- a/tests/test-obsolete.t
+++ b/tests/test-obsolete.t
@@ -1044,6 +1044,15 @@  test debugwhyunstable output
   orphan: obsolete parent 3de5eca88c00aa039da7399a220f4a5221faa585
   phase-divergent: immutable predecessor 245bde4270cd1072a27757984f9cda8ba26f08ca
 
+test whyunstable template keyword
+
+  $ hg log -r 50c51b361e60 -T '{whyunstable}\n'
+  orphan: obsolete parent 3de5eca88c00
+  phase-divergent: immutable predecessor 245bde4270cd
+  $ hg log -r 50c51b361e60 -T '{whyunstable%"{instability}: {reason} {node}\n"}'
+  orphan: obsolete parent 3de5eca88c00aa039da7399a220f4a5221faa585
+  phase-divergent: immutable predecessor 245bde4270cd1072a27757984f9cda8ba26f08ca
+
 #if serve
 
   $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log