Re: [PATCH 2 of 2 v2] revert: use an exact matcher in interactive diff selection (issue5789)

2018-02-14 Thread Yuya Nishihara
On Wed, 14 Feb 2018 14:15:21 +0100, Denis Laxalde wrote:
> # HG changeset patch
> # User Denis Laxalde 
> # Date 1518613925 -3600
> #  Wed Feb 14 14:12:05 2018 +0100
> # Node ID 6b505da3e8351e945b0e71a65870cbe2578b99ae
> # Parent  75a4598a4375d80d240c19625e2c43a069ba9618
> # Available At http://hg.logilab.org/users/dlaxalde/hg
> #  hg pull http://hg.logilab.org/users/dlaxalde/hg -r 6b505da3e835
> # EXP-Topic revert-interactive-pats
> revert: use an exact matcher in interactive diff selection (issue5789)

Queued, thanks.

> -torevert = [repo.wjoin(f) for f in actions['revert'][0]]
> -m = scmutil.match(ctx, torevert, matcher_opts)
> +torevert = (f for f in actions['revert'][0] if f not in 
> excluded_files)

Changed this to a list, which is probably safer than passing an iterator to
matchmod.

> +m = scmutil.matchfiles(repo, torevert)
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


[PATCH 2 of 2 v2] revert: use an exact matcher in interactive diff selection (issue5789)

2018-02-14 Thread Denis Laxalde
# HG changeset patch
# User Denis Laxalde 
# Date 1518613925 -3600
#  Wed Feb 14 14:12:05 2018 +0100
# Node ID 6b505da3e8351e945b0e71a65870cbe2578b99ae
# Parent  75a4598a4375d80d240c19625e2c43a069ba9618
# Available At http://hg.logilab.org/users/dlaxalde/hg
#  hg pull http://hg.logilab.org/users/dlaxalde/hg -r 6b505da3e835
# EXP-Topic revert-interactive-pats
revert: use an exact matcher in interactive diff selection (issue5789)

When going through _performrevert() in the interactive case, we build a
matcher with files to revert and pass it patch.diff() for later
selection of diff hunks to revert. The files set used to build the
matcher comes from dirstate and accounts for patterns explicitly passed
to revert ('hg revert -i ') and, in case of nonexistent pattern,
this set is empty (which is expected). Unfortunately, the matcher built
from scmutil.match(ctx, []) is wrong as it leads patch.diff() to rebuild
a 'changes' tuple with dirstate information, ignoring user-specified
pattern. This leads to the situation described in issue5789, where
one gets prompted about reverting files unrelated to specified patterns
because they made a typo or so.

We fix this by building an exact matcher with the correct set of file
paths (built earlier). Thanks to Yuya Nishihara for suggesting the
correct fix.

diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
--- a/mercurial/cmdutil.py
+++ b/mercurial/cmdutil.py
@@ -2906,7 +2906,6 @@ def _performrevert(repo, parents, ctx, a
 parent, p2 = parents
 node = ctx.node()
 excluded_files = []
-matcher_opts = {"exclude": excluded_files}
 
 def checkout(f):
 fc = ctx[f]
@@ -2927,7 +2926,7 @@ def _performrevert(repo, parents, ctx, a
 if choice == 0:
 repo.dirstate.drop(f)
 else:
-excluded_files.append(repo.wjoin(f))
+excluded_files.append(f)
 else:
 repo.dirstate.drop(f)
 for f in actions['remove'][0]:
@@ -2938,7 +2937,7 @@ def _performrevert(repo, parents, ctx, a
 if choice == 0:
 doremove(f)
 else:
-excluded_files.append(repo.wjoin(f))
+excluded_files.append(f)
 else:
 doremove(f)
 for f in actions['drop'][0]:
@@ -2958,8 +2957,8 @@ def _performrevert(repo, parents, ctx, a
 newlyaddedandmodifiedfiles = set()
 if interactive:
 # Prompt the user for changes to revert
-torevert = [repo.wjoin(f) for f in actions['revert'][0]]
-m = scmutil.match(ctx, torevert, matcher_opts)
+torevert = (f for f in actions['revert'][0] if f not in excluded_files)
+m = scmutil.matchfiles(repo, torevert)
 diffopts = patch.difffeatureopts(repo.ui, whitespace=True)
 diffopts.nodates = True
 diffopts.git = True
diff --git a/tests/test-revert-interactive.t b/tests/test-revert-interactive.t
--- a/tests/test-revert-interactive.t
+++ b/tests/test-revert-interactive.t
@@ -428,9 +428,5 @@ When specified pattern does not exist, w
   b: no such file in rev b40d1912accf
   $ hg rev -i b
   b: no such file in rev b40d1912accf
-  diff --git a/a b/a
-  1 hunks, 1 lines changed
-  examine changes to 'a'? [Ynesfdaq?] abort: response expected
-  [255]
 
   $ cd ..
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel