[PATCH 2 of 2] log: make --line-range and --graph options work together

Denis Laxalde denis at laxalde.org
Sun Feb 11 11:57:21 EST 2018


# HG changeset patch
# User Denis Laxalde <denis at laxalde.org>
# Date 1518356534 -3600
#      Sun Feb 11 14:42:14 2018 +0100
# Node ID 72ad5a53d41102d5e67a925cabc1aa9635d1fda8
# Parent  50e9309bc899d5366811e8da9fe4dcc303aa4796
# EXP-Topic log/linerange-graph
log: make --line-range and --graph options work together

Pass "hunksfilter" (computed in "if linerange:" block) down through
logcmdutil.graphlog() and logcmdutil.displaygraph() so that the
revhunksfilter function can be built and used by displayer.show(). The
logic is similar to the non-graph log case.

diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -3313,8 +3313,8 @@ def log(ui, repo, *pats, **opts):
        Use -L/--line-range FILE,M:N options to follow the history of lines
        from M to N in FILE. With -p/--patch only diff hunks affecting
        specified line range will be shown. This option requires --follow;
-       it can be specified multiple times. Currently, this option is not
-       compatible with --graph. This option is experimental.
+       it can be specified multiple times.
+       This option is experimental.
 
     .. note::
 
@@ -3422,11 +3422,6 @@ def log(ui, repo, *pats, **opts):
     revs, filematcher = logcmdutil.getrevs(repo, pats, opts)
     hunksfilter = None
 
-    if opts.get('graph'):
-        if linerange:
-            raise error.Abort(_('graph not supported with line range patterns'))
-        return logcmdutil.graphlog(ui, repo, revs, filematcher, opts)
-
     if linerange:
         revs, lrfilematcher, hunksfilter = logcmdutil.getlinerangerevs(
             repo, revs, opts)
@@ -3442,6 +3437,10 @@ def log(ui, repo, *pats, **opts):
         elif filematcher is None:
             filematcher = lrfilematcher
 
+    if opts.get('graph'):
+        return logcmdutil.graphlog(ui, repo, revs, filematcher, hunksfilter,
+                                   opts)
+
     getrenamed = None
     if opts.get('copies'):
         endrev = None
diff --git a/mercurial/logcmdutil.py b/mercurial/logcmdutil.py
--- a/mercurial/logcmdutil.py
+++ b/mercurial/logcmdutil.py
@@ -862,7 +862,7 @@ def _graphnodeformatter(ui, displayer):
     return formatnode
 
 def displaygraph(ui, repo, dag, displayer, edgefn, getrenamed=None,
-                 filematcher=None, props=None):
+                 filematcher=None, hunksfilter=None, props=None):
     props = props or {}
     formatnode = _graphnodeformatter(ui, displayer)
     state = graphmod.asciistate()
@@ -900,10 +900,14 @@ def displaygraph(ui, repo, dag, displaye
         revmatchfn = None
         if filematcher is not None:
             revmatchfn = filematcher(ctx.rev())
+        revhunksfilter = None
+        if hunksfilter:
+            revhunksfilter = hunksfilter(ctx.rev())
         edges = edgefn(type, char, state, rev, parents)
         firstedge = next(edges)
         width = firstedge[2]
         displayer.show(ctx, copies=copies, matchfn=revmatchfn,
+                       hunksfilterfn=revhunksfilter,
                        _graphwidth=width, **pycompat.strkwargs(props))
         lines = displayer.hunk.pop(rev).split('\n')
         if not lines[-1]:
@@ -914,7 +918,7 @@ def displaygraph(ui, repo, dag, displaye
             lines = []
     displayer.close()
 
-def graphlog(ui, repo, revs, filematcher, opts):
+def graphlog(ui, repo, revs, filematcher, hunksfilter, opts):
     # Parameters are identical to log command ones
     revdag = graphmod.dagwalker(repo, revs)
 
@@ -928,7 +932,7 @@ def graphlog(ui, repo, revs, filematcher
     ui.pager('log')
     displayer = changesetdisplayer(ui, repo, opts, buffered=True)
     displaygraph(ui, repo, revdag, displayer, graphmod.asciiedges, getrenamed,
-                 filematcher)
+                 filematcher, hunksfilter)
 
 def checkunsupportedgraphflags(pats, opts):
     for op in ["newest_first"]:
diff --git a/tests/test-log-linerange.t b/tests/test-log-linerange.t
--- a/tests/test-log-linerange.t
+++ b/tests/test-log-linerange.t
@@ -173,8 +173,76 @@ Add some changes with two diff hunks
   +4
   
   $ hg log -f --graph -L foo,5:7 -p
-  abort: graph not supported with line range patterns
-  [255]
+  @  changeset:   5:cfdf972b3971
+  |  tag:         tip
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     foo: 3 -> 3+ and 11+ -> 11-; bar: a -> a+
+  |
+  |  diff --git a/foo b/foo
+  |  --- a/foo
+  |  +++ b/foo
+  |  @@ -4,7 +4,7 @@
+  |   0
+  |    1
+  |   2+
+  |  -3
+  |  +3+
+  |   4
+  |   5
+  |   6
+  |
+  o  changeset:   4:eaec41c1a0c9
+  :  user:        test
+  :  date:        Thu Jan 01 00:00:00 1970 +0000
+  :  summary:     11 -> 11+; leading space before "1"
+  :
+  :  diff --git a/foo b/foo
+  :  --- a/foo
+  :  +++ b/foo
+  :  @@ -2,7 +2,7 @@
+  :   0
+  :   0
+  :   0
+  :  -1
+  :  + 1
+  :   2+
+  :   3
+  :   4
+  :
+  o  changeset:   2:63a884426fd0
+  :  user:        test
+  :  date:        Thu Jan 01 00:00:00 1970 +0000
+  :  summary:     2 -> 2+; added bar
+  :
+  :  diff --git a/foo b/foo
+  :  --- a/foo
+  :  +++ b/foo
+  :  @@ -3,6 +3,6 @@
+  :   0
+  :   0
+  :   1
+  :  -2
+  :  +2+
+  :   3
+  :   4
+  :
+  o  changeset:   0:5ae1f82b9a00
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     init
+  
+     diff --git a/foo b/foo
+     new file mode 100644
+     --- /dev/null
+     +++ b/foo
+     @@ -0,0 +1,5 @@
+     +0
+     +1
+     +2
+     +3
+     +4
+  
 
 With --template.
 


More information about the Mercurial-devel mailing list