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

login
register
mail settings
Submitter Denis Laxalde
Date Nov. 29, 2019, 8:59 p.m.
Message ID <8e65df8a972333c0d30b.1575061159@marimba>
Download mbox | patch
Permalink /patch/43540/
State New
Headers show

Comments

Denis Laxalde - Nov. 29, 2019, 8:59 p.m.
# HG changeset patch
# User Denis Laxalde <denis@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.
Yuya Nishihara - Nov. 30, 2019, 4:31 a.m.
On Fri, 29 Nov 2019 21:59:19 +0100, Denis Laxalde wrote:
> # HG changeset patch
> # User Denis Laxalde <denis@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

> 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

Mapping None to wdirrev seems more correct. Hopefully that will fix
-fr'wdir()' -L line-range.

Patch

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.