commit: if interactive, look elsewhere for whitespace settings (BC)
Previously, when doing `commit -i`, we respected `diff.ignorews` and other
whitespace-related settings, which is probably unexpected. The primary reason
for this is to support hgext.record's commandline options, it's probably
accidental that the `[diff]` settings were also considered. See comments on
issue6042 and D5490. This can cause problems (issue5839, issue6042).
It is assumed by the author that the `[diff]` section is primarily for *viewing*
diffs, and that it is unlikely what people intend when attempting to commit or
revert.
With this change, if a user wants the behavior, they can clone their `[diff]`
settings to `commands.commit.interactive.<setting>`. This is thus a mild BC
change, but one I suspect is not going to be relied on by anyone.
Note: while doing a partial commit/revert, we do not know what command the user
is actually running. This means that the split extension, which ends up calling
into this code, will respect the `commands.commit.interactive.<setting>`
settings, and not a hypothetical `commands.split.interactive.<setting>`. This
*also* means that setting `commands.commit.interactive.ignoreblanklines`, for
example, will still cause issue5839. Considering the highly unlikely chance that
a user actually sets `commands.commit.interactive.<setting>`, the author deems
this risk acceptable.
Differential Revision: https://phab.mercurial-scm.org/D5834
--- a/mercurial/cmdutil.py Thu Jan 31 14:29:24 2019 -0800
+++ b/mercurial/cmdutil.py Thu Jan 31 14:47:34 2019 -0800
@@ -282,7 +282,9 @@
status = repo.status(match=match)
if not force:
repo.checkcommitpatterns(wctx, vdirs, match, status, fail)
- diffopts = patch.difffeatureopts(ui, opts=opts)
+ diffopts = patch.difffeatureopts(ui, opts=opts, whitespace=True,
+ section='commands',
+ configprefix='commit.interactive.')
diffopts.nodates = True
diffopts.git = True
diffopts.showfunc = True
@@ -3126,7 +3128,9 @@
# Prompt the user for changes to revert
torevert = [f for f in actions['revert'][0] if f not in excluded_files]
m = scmutil.matchfiles(repo, torevert)
- diffopts = patch.difffeatureopts(repo.ui)
+ diffopts = patch.difffeatureopts(repo.ui, whitespace=True,
+ section='commands',
+ configprefix='revert.interactive.')
diffopts.nodates = True
diffopts.git = True
operation = 'discard'
--- a/mercurial/configitems.py Thu Jan 31 14:29:24 2019 -0800
+++ b/mercurial/configitems.py Thu Jan 31 14:47:34 2019 -0800
@@ -201,6 +201,7 @@
coreconfigitem('color', 'pagermode',
default=dynamicdefault,
)
+_registerdiffopts(section='commands', configprefix='commit.interactive.')
coreconfigitem('commands', 'grep.all-files',
default=False,
)
@@ -213,6 +214,7 @@
coreconfigitem('commands', 'resolve.mark-check',
default='none',
)
+_registerdiffopts(section='commands', configprefix='revert.interactive.')
coreconfigitem('commands', 'show.aliasprefix',
default=list,
)
--- a/tests/test-commit-interactive.t Thu Jan 31 14:29:24 2019 -0800
+++ b/tests/test-commit-interactive.t Thu Jan 31 14:47:34 2019 -0800
@@ -1808,7 +1808,7 @@
$ hg status -A subdir/f1
M subdir/f1
-Test diff.unified=0
+Test commands.commit.interactive.unified=0
$ hg init $TESTTMP/b
$ cd $TESTTMP/b
@@ -1829,7 +1829,7 @@
> 4
> 5
> EOF
- $ printf 'y\ny\ny\n' | hg ci -im initial --config diff.unified=0
+ $ printf 'y\ny\ny\n' | hg ci -im initial --config commands.commit.interactive.unified=0
diff --git a/foo b/foo
2 hunks, 2 lines changed
examine changes to 'foo'? [Ynesfdaq?] y
--- a/tests/test-split.t Thu Jan 31 14:29:24 2019 -0800
+++ b/tests/test-split.t Thu Jan 31 14:47:34 2019 -0800
@@ -26,6 +26,8 @@
> [diff]
> git=1
> unified=0
+ > [commands]
+ > commit.interactive.unified=0
> [alias]
> glog=log -G -T '{rev}:{node|short} {desc} {bookmarks}\n'
> EOF
@@ -105,10 +107,10 @@
This function splits a bit strangely primarily to avoid changing the behavior of
the test after a bug was fixed with how split/commit --interactive handled
-`diff.unified=0`: when there were no context lines, it kept only the last diff
-hunk. When running split, this meant that runsplit was always recording three commits,
-one for each diff hunk, in reverse order (the base commit was the last diff hunk
-in the file).
+`commands.commit.interactive.unified=0`: when there were no context lines,
+it kept only the last diff hunk. When running split, this meant that runsplit
+was always recording three commits, one for each diff hunk, in reverse order
+(the base commit was the last diff hunk in the file).
$ runsplit() {
> cat > $TESTTMP/messages <<EOF
> split 1