[PATCH 1 of 2] template: add shortestnode keyword

Durham Goode durham at fb.com
Fri Jan 17 08:45:29 UTC 2014


# HG changeset patch
# User Durham Goode <durham at fb.com>
# Date 1389946237 28800
#      Fri Jan 17 00:10:37 2014 -0800
# Node ID b18359a70b640d2aeb3f4afd1c8e47d775402b8e
# Parent  6545770bd37991b4ff0400479455a6e3ffa5976b
template: add shortestnode keyword

Adds a '{shortestnode}' template keyword that results in the shortest hex node
that uniquely identifies the changeset at that time.

I wanted to do this as a filter, like '{node|shortest}', but filters don't
have access to the repo.

diff --git a/mercurial/templatekw.py b/mercurial/templatekw.py
--- a/mercurial/templatekw.py
+++ b/mercurial/templatekw.py
@@ -307,6 +307,28 @@
     """
     return ctx.hex()
 
+def showshortestnode(repo, ctx, templ, **args):
+    """:shortestnode: String. The shortest changeset identification hash that
+    uniquely identifies the changeset.
+    """
+    node = ctx.hex()
+
+    shortest = node
+    length = 6
+    cl = repo.changelog
+    while True:
+        test = node[:length]
+        try:
+            cl.index.partialmatch(test)
+            if length == 4:
+                return test
+            length -= 1
+            shortest = test
+        except error.RevlogError:
+            length += 1
+            if len(shortest) == length:
+                return shortest
+
 def showp1rev(repo, ctx, templ, **args):
     """:p1rev: Integer. The repository-local revision number of the changeset's
     first parent, or -1 if the changeset has no parents."""
@@ -381,6 +403,7 @@
     'phase': showphase,
     'phaseidx': showphaseidx,
     'rev': showrev,
+    'shortestnode': showshortestnode,
     'tags': showtags,
 }
 
diff --git a/tests/test-command-template.t b/tests/test-command-template.t
--- a/tests/test-command-template.t
+++ b/tests/test-command-template.t
@@ -1626,3 +1626,12 @@
 
   $ hg log -r 0 --template '{if(branches, "yes", "no")}\n'
   no
+
+Test shortestnode keyword:
+
+  $ echo b > b
+  $ hg ci -qAm b
+  $ hg log --template '{shortestnode}\n'
+  d97c
+  f776
+


More information about the Mercurial-devel mailing list