diff mercurial/hgweb/webcommands.py @ 35566:baca93a47992

hgweb: make different kinds of commits look differently on /graph Regular hg log -G uses different symbols for some graph nodes, such as commits that close branches and hidden commits. It also marks the currently checked out commit with "@". Since hg serve is sometimes used/recommended as a more visual alternative to CLI, it makes sense to port these features to hgweb. "graphnode" includes the style of a particular node and also if it's currently checked out or not, both at the same time. This is different from hg log -G (which uses templatekw.showgraphnode), where there's only place for one character, but hgweb doesn't have this limitation, since it uses <canvas> and not plain text. I'm using one string of 1 or 2 characters in this patch, it's not the most self-explanatory format, but it's concise, uses the same characters as hg log -G, and is internal to hgweb (i.e. not used for json-graph). I'm more or less fine with how things look visually, but there's still room for improvement. Feel free to criticise or point me to good-looking graphs of this kind for inspiration.
author Anton Shestakov <av6@dwimlabs.net>
date Tue, 19 Dec 2017 20:41:25 +0800
parents acd8a2454b47
children 0ef50a5e3ae1
line wrap: on
line diff
--- a/mercurial/hgweb/webcommands.py	Thu Dec 21 13:58:11 2017 +0100
+++ b/mercurial/hgweb/webcommands.py	Tue Dec 19 20:41:25 2017 +0800
@@ -13,7 +13,7 @@
 import re
 
 from ..i18n import _
-from ..node import hex, short
+from ..node import hex, nullid, short
 
 from .common import (
     ErrorResponse,
@@ -1248,6 +1248,24 @@
         tree = list(item for item in graphmod.colored(dag, web.repo)
                     if item[1] == graphmod.CHANGESET)
 
+    def nodecurrent(ctx):
+        wpnodes = web.repo.dirstate.parents()
+        if wpnodes[1] == nullid:
+            wpnodes = wpnodes[:1]
+        if ctx.node() in wpnodes:
+            return '@'
+        return ''
+
+    def nodesymbol(ctx):
+        if ctx.obsolete():
+            return 'x'
+        elif ctx.isunstable():
+            return '*'
+        elif ctx.closesbranch():
+            return '_'
+        else:
+            return 'o'
+
     def fulltree():
         pos = web.repo[graphtop].rev()
         tree = []
@@ -1260,6 +1278,7 @@
 
     def jsdata():
         return [{'node': pycompat.bytestr(ctx),
+                 'graphnode': nodecurrent(ctx) + nodesymbol(ctx),
                  'vertex': vtx,
                  'edges': edges}
                 for (id, type, ctx, vtx, edges) in fulltree()]