[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