templatekw: add experimental {status} keyword
authorYuya Nishihara <yuya@tcha.org>
Sun, 29 Jul 2018 22:04:01 +0900
changeset 39600 87428152e820
parent 39599 a5da906306c9
child 39601 84d6e9a2b104
templatekw: add experimental {status} keyword This is another example of fctx-based keywords. I think this is somewhat useful in log templates.
mercurial/templatekw.py
tests/test-template-keywords.t
--- a/mercurial/templatekw.py	Sun Jul 29 21:52:01 2018 +0900
+++ b/mercurial/templatekw.py	Sun Jul 29 22:04:01 2018 +0900
@@ -301,6 +301,15 @@
         revcache['filestatusall'] = listall
     return revcache['filestatus']
 
+def _getfilestatusmap(context, mapping, listall=False):
+    revcache = context.resource(mapping, 'revcache')
+    if 'filestatusmap' not in revcache or revcache['filestatusall'] < listall:
+        stat = _getfilestatus(context, mapping, listall=listall)
+        revcache['filestatusmap'] = statmap = {}
+        for char, files in zip(pycompat.iterbytestr('MAR!?IC'), stat):
+            statmap.update((f, char) for f in files)
+    return revcache['filestatusmap']  # {path: statchar}
+
 def _showfilesbystat(context, mapping, name, index):
     stat = _getfilestatus(context, mapping)
     files = stat[index]
@@ -595,6 +604,19 @@
     fctx = context.resource(mapping, 'fctx')
     return fctx.size()
 
+# requires 'fctx' to denote {status} depends on (ctx, path) pair
+@templatekeyword('status', requires={'ctx', 'fctx', 'revcache'})
+def showstatus(context, mapping):
+    """String. Status code of the current file. (EXPERIMENTAL)"""
+    path = templateutil.runsymbol(context, mapping, 'path')
+    path = templateutil.stringify(context, mapping, path)
+    if not path:
+        return
+    statmap = _getfilestatusmap(context, mapping)
+    if path not in statmap:
+        statmap = _getfilestatusmap(context, mapping, listall=True)
+    return statmap.get(path)
+
 @templatekeyword("successorssets", requires={'repo', 'ctx'})
 def showsuccessorssets(context, mapping):
     """Returns a string of sets of successors for a changectx. Format used
--- a/tests/test-template-keywords.t	Sun Jul 29 21:52:01 2018 +0900
+++ b/tests/test-template-keywords.t	Sun Jul 29 22:04:01 2018 +0900
@@ -789,12 +789,19 @@
 
 Test file attributes:
 
-  $ hg log -l1 -T '{files % "{pad(size, 3, left=True)} {path}\n"}'
-      a
-    0 b
-    7 fifth
-      fourth
-   13 third
+  $ hg log -l1 -T '{files % "{status} {pad(size, 3, left=True)} {path}\n"}'
+  R     a
+  A   0 b
+  A   7 fifth
+  R     fourth
+  M  13 third
+
+Test file status including clean ones:
+
+  $ hg log -r9 -T '{files("**") % "{status} {path}\n"}'
+  A a
+  C fourth
+  C third
 
 Test index keyword: