[PATCH 2 of 2 STABLE] py3: fix 'log --line-range' with uncommitted changes in range

Denis Laxalde denis at laxalde.org
Fri Nov 29 15:59:19 EST 2019


# HG changeset patch
# User Denis Laxalde <denis at laxalde.org>
# Date 1575060193 -3600
#      Fri Nov 29 21:43:13 2019 +0100
# Branch stable
# Node ID 8e65df8a972333c0d30b03f5dee4ce802088d799
# Parent  969e8a52e3842d19387d02e91d6a19a993950ac0
py3: fix 'log --line-range' with uncommitted changes in range

When 'hg log -f --line-range <file>,<range>' is invoked with <range>
containing uncommitted changes, the command crashes on Python 3 as
follows:

      [...]
      File "/usr/lib/python3/dist-packages/mercurial/commands.py", line 4725, in log
        revs, differ = logcmdutil.getlinerangerevs(repo, revs, opts)
      File "/usr/lib/python3/dist-packages/mercurial/logcmdutil.py", line 933, in getlinerangerevs
        if rev not in userrevs:
      File "/usr/lib/python3/dist-packages/mercurial/smartset.py", line 969, in __contains__
        if l < x:
    TypeError: '<' not supported between instances of 'int' and 'NoneType'

The None value is because requested line range has uncommitted changes.
This only occurs in Python 3 as Python 2 allows comparing None with int.
Skipping None while walking block ancestors in
logcmdutil.getlinerangerevs() resolves the problem.

diff --git a/mercurial/logcmdutil.py b/mercurial/logcmdutil.py
--- a/mercurial/logcmdutil.py
+++ b/mercurial/logcmdutil.py
@@ -930,7 +930,7 @@ def getlinerangerevs(repo, userrevs, opt
         fctx = wctx.filectx(fname)
         for fctx, linerange in dagop.blockancestors(fctx, fromline, toline):
             rev = fctx.introrev()
-            if rev not in userrevs:
+            if rev is None or rev not in userrevs:
                 continue
             linerangesbyrev.setdefault(rev, {}).setdefault(
                 fctx.path(), []
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
@@ -898,6 +898,53 @@ Uncommitted changes with a rename
   date:        Thu Jan 01 00:00:00 1970 +0000
   summary:     init
   
+
+Uncommitted changes in requested line range
+
+  $ sed 's/2/  /' bazn > bazn.new
+  $ mv bazn.new bazn
+  $ hg diff
+  diff --git a/dir/baz b/dir/bazn
+  rename from dir/baz
+  rename to dir/bazn
+  --- a/dir/baz
+  +++ b/dir/bazn
+  @@ -3,7 +3,7 @@
+   0
+   0
+    1+
+  -2+
+  +  +
+   3+
+   4
+   5
+  $ hg log -f -L bazn,5:7
+  changeset:   9:6af29c3a778f
+  tag:         tip
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     foo -> dir/baz; 1-1+
+  
+  changeset:   5:cfdf972b3971
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     foo: 3 -> 3+ and 11+ -> 11-; bar: a -> a+
+  
+  changeset:   4:eaec41c1a0c9
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     11 -> 11+; leading space before "1"
+  
+  changeset:   2:63a884426fd0
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     2 -> 2+; added bar
+  
+  changeset:   0:5ae1f82b9a00
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     init
+  
   $ hg revert -a -C -q
 
 Binary files work but without diff hunks filtering.



More information about the Mercurial-devel mailing list