[PATCH 1 of 2] templates: add whyunstable template keyword

Anton Shestakov av6 at dwimlabs.net
Mon Mar 26 11:55:20 UTC 2018


# HG changeset patch
# User Anton Shestakov <av6 at dwimlabs.net>
# Date 1522054812 -28800
#      Mon Mar 26 17:00:12 2018 +0800
# Node ID 123d9e4d706909c8912f11acee292735c0fb283c
# Parent  6f570c501e3ebc3d9b59920f50ed7523d93cb847
templates: add whyunstable template keyword

diff --git a/mercurial/templatekw.py b/mercurial/templatekw.py
--- a/mercurial/templatekw.py
+++ b/mercurial/templatekw.py
@@ -794,6 +794,40 @@ def showverbosity(context, mapping):
         return 'verbose'
     return ''
 
+ at templatekeyword('whyunstable', requires={'repo', 'ctx', 'templ'})
+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())
+
+    def formatentry(entry):
+        dnodes = ''
+        if entry.get('divergentnodes'):
+            dnodes = ' '.join(formatnode(ctx)
+                              for ctx in entry['divergentnodes']) + ' '
+        return '%s: %s%s %s' % (entry['instability'],
+                                dnodes,
+                                entry['reason'],
+                                scmutil.formatchangeid(repo[entry['node']]))
+
+    def makemap(entry):
+        item = {'ctx': repo[entry['node']], 'revcache': {}}
+        item.update(entry)
+        if item.get('divergentnodes'):
+            dnhybrid = _hybrid(None, item['divergentnodes'],
+                               lambda x: {'ctx': x, 'revcache': {}},
+                               formatnode)
+            item['divergentnodes'] = dnhybrid
+        return item
+
+    entries = obsutil.whyunstable(repo, ctx)
+    return _hybrid(None, entries, makemap, formatentry)
+
 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,13 @@ 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 2:a178212c3433
+  $ hg log -r 1a2a9b5b0030 --hidden -T '{whyunstable%"{instability}: {divergentnodes} {reason} {node}\n"}'
+  content-divergent: 4:70d5a63ca112 (draft) predecessor a178212c3433c4e77b573f6011e29affb8aefa33
+  $ hg log -r 1a2a9b5b0030 --hidden -T '{whyunstable%"{instability}: {divergentnodes%"{node} ({phase})"} {reason} {node}\n"}'
+  content-divergent: 70d5a63ca112acb3764bc1d7320ca90ea688d671 (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
@@ -1039,6 +1039,14 @@ 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 6:3de5eca88c00 phase-divergent: immutable predecessor 2: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


More information about the Mercurial-devel mailing list