threads / patch / 41487

patch, 5 partsDocumentation/diff-config: fix description of diff.renames

Subject: [PATCH 1/5] Documentation/diff-config: fix description of diff.renames

## tl;dr

29 messages between Feb 23, 2016 and Feb 25, 2016. Diffs are folded; open one to read it.

replies: 28people: 5as markdown or json

Matthieu Moy· Feb 23, 2016, 17:44 UTC · lore

[PATCH 0/5] activate diff.renames by default

I have always wondered why diff.renames was not activated by default. I've had it to true in my configuration for 9 years, and I've been teaching newbies to set it for a while without issue. I think it's time to activate it by default, but please let me know if I missed a reason to keep it to false.

In any case, the first 3 patches are useful cleanups.
Matthieu Moy (5):
  Documentation/diff-config: fix description of diff.renames
  t4001-diff-rename: wrap file creations in a test
  t: add tests for diff.renames (true/false/unset)
  log: introduce init_log_defaults()
  diff: activate diff.renames by default
 Documentation/diff-config.txt |  7 ++--
 builtin/commit.c              |  1 +
 builtin/diff.c                |  1 +
 builtin/log.c                 | 16 ++++---
 builtin/merge.c               |  1 +
 diff.c                        |  5 +++
 diff.h                        |  1 +
 t/t4001-diff-rename.sh        | 97 +++++++++++++++++++++++++++++++++++--------
 t/t4013-diff-various.sh       |  2 +
 t/t4014-format-patch.sh       |  4 +-
 t/t4047-diff-dirstat.sh       |  3 +-
 t/t4202-log.sh                |  8 ++--
 12 files changed, 114 insertions(+), 32 deletions(-)
-- 
2.7.2.334.g35ed2ae.dirty
Matthieu Moy· Feb 23, 2016, 17:44 UTC · re: Matthieu Moy · lore

The description was misleading, since "set to any boolean value" include "set to false", and diff.renames=false does not enable basic detection, but actually disables it.

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
---
 Documentation/diff-config.txt | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)
Show changes to Documentation/diff-config.txt +4 −3
diff --git a/Documentation/diff-config.txt b/Documentation/diff-config.txt
index 6eaa452..1acd203 100644
--- a/Documentation/diff-config.txt
+++ b/Documentation/diff-config.txt
@@ -108,9 +108,10 @@ diff.renameLimit::
 	detection; equivalent to the 'git diff' option '-l'.
 
 diff.renames::
-	Tells Git to detect renames.  If set to any boolean value, it
-	will enable basic rename detection.  If set to "copies" or
-	"copy", it will detect copies, as well.
+	Whether and how Git detects renames.  If set to "false",
+	rename detection is disabled. If set to "true", basic rename
+	detection is enable.  If set to "copies" or "copy", Git will
+	detect copies, as well.  Defaults to false.
 
 diff.suppressBlankEmpty::
 	A boolean to inhibit the standard behavior of printing a space
-- 
2.7.2.334.g35ed2ae.dirty
Jeff King· Feb 24, 2016, 10:27 UTC · re: Matthieu Moy · lore

Re: [PATCH 1/5] Documentation/diff-config: fix description of diff.renames

On Tue, Feb 23, 2016 at 06:44:54PM +0100, Matthieu Moy wrote:
Show 24 quoted lines
> The description was misleading, since "set to any boolean value" include
> "set to false", and diff.renames=false does not enable basic detection,
> but actually disables it.
> 
> Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
> ---
>  Documentation/diff-config.txt | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/Documentation/diff-config.txt b/Documentation/diff-config.txt
> index 6eaa452..1acd203 100644
> --- a/Documentation/diff-config.txt
> +++ b/Documentation/diff-config.txt
> @@ -108,9 +108,10 @@ diff.renameLimit::
>  	detection; equivalent to the 'git diff' option '-l'.
>  
>  diff.renames::
> -	Tells Git to detect renames.  If set to any boolean value, it
> -	will enable basic rename detection.  If set to "copies" or
> -	"copy", it will detect copies, as well.
> +	Whether and how Git detects renames.  If set to "false",
> +	rename detection is disabled. If set to "true", basic rename
> +	detection is enable.  If set to "copies" or "copy", Git will
> +	detect copies, as well.  Defaults to false.

Looks OK to me. I thought we had "copies-harder" or something, but I double-checked and we don't. I doubt anybody would want to set it anyway, as it can be quite expensive.

-Peff
Felipe Gonçalves Assis· Feb 25, 2016, 17:27 UTC · re: Matthieu Moy · lore

Re: [PATCH 1/5] Documentation/diff-config: fix description of diff.renames

Matthieu Moy <Matthieu.Moy <at> imag.fr> writes:
Show 8 quoted lines
>  diff.renames::
> -	Tells Git to detect renames.  If set to any boolean value, it
> -	will enable basic rename detection.  If set to "copies" or
> -	"copy", it will detect copies, as well.
> +	Whether and how Git detects renames.  If set to "false",
> +	rename detection is disabled. If set to "true", basic rename
> +	detection is enable.  If set to "copies" or "copy", Git will
> +	detect copies, as well.  Defaults to false.

Just a minor typo: s/enable/enabled/ Also, there is only one space between the second and third sentences.

Just in case you haven't already fixed that.

Regards, Felipe

Matthieu Moy· Feb 25, 2016, 17:34 UTC · re: Felipe Gonçalves Assis · lore

Re: [PATCH 1/5] Documentation/diff-config: fix description of diff.renames

Felipe Gonçalves Assis <felipeg.assis@gmail.com> writes:
Show 13 quoted lines
> Matthieu Moy <Matthieu.Moy <at> imag.fr> writes:
>
>>  diff.renames::
>> -	Tells Git to detect renames.  If set to any boolean value, it
>> -	will enable basic rename detection.  If set to "copies" or
>> -	"copy", it will detect copies, as well.
>> +	Whether and how Git detects renames.  If set to "false",
>> +	rename detection is disabled. If set to "true", basic rename
>> +	detection is enable.  If set to "copies" or "copy", Git will
>> +	detect copies, as well.  Defaults to false.
>
> Just a minor typo: s/enable/enabled/
> Also, there is only one space between the second and third sentences.
Indeed. Thanks.
-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/
Matthieu Moy· Feb 23, 2016, 17:44 UTC · re: Matthieu Moy · lore

[PATCH 2/5] t4001-diff-rename: wrap file creations in a test

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
---
 t/t4001-diff-rename.sh | 38 +++++++++++++++++++++-----------------
 1 file changed, 21 insertions(+), 17 deletions(-)
Show changes to t/t4001-diff-rename.sh +20 −16
diff --git a/t/t4001-diff-rename.sh b/t/t4001-diff-rename.sh
index 2f327b7..bfb364c 100755
--- a/t/t4001-diff-rename.sh
+++ b/t/t4001-diff-rename.sh
@@ -9,7 +9,9 @@ test_description='Test rename detection in diff engine.
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/diff-lib.sh
 
-echo >path0 'Line 1
+test_expect_success 'setup' '
+	cat >path0 <<\EOF &&
+Line 1
 Line 2
 Line 3
 Line 4
@@ -24,6 +26,23 @@ Line 12
 Line 13
 Line 14
 Line 15
+EOF
+	cat >expected <<\EOF
+diff --git a/path0 b/path1
+rename from path0
+rename to path1
+--- a/path0
++++ b/path1
+@@ -8,7 +8,7 @@ Line 7
+ Line 8
+ Line 9
+ Line 10
+-line 11
++Line 11
+ Line 12
+ Line 13
+ Line 14
+EOF
 '
 
 test_expect_success \
@@ -43,22 +62,7 @@ test_expect_success \
 test_expect_success \
     'git diff-index -p -M after rename and editing.' \
     'git diff-index -p -M $tree >current'
-cat >expected <<\EOF
-diff --git a/path0 b/path1
-rename from path0
-rename to path1
---- a/path0
-+++ b/path1
-@@ -8,7 +8,7 @@ Line 7
- Line 8
- Line 9
- Line 10
--line 11
-+Line 11
- Line 12
- Line 13
- Line 14
-EOF
+
 
 test_expect_success \
     'validate the output.' \
-- 
2.7.2.334.g35ed2ae.dirty
Jeff King· Feb 24, 2016, 10:25 UTC · re: Matthieu Moy · lore

Re: [PATCH 2/5] t4001-diff-rename: wrap file creations in a test

On Tue, Feb 23, 2016 at 06:44:55PM +0100, Matthieu Moy wrote:
Show 20 quoted lines
> Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
> ---
>  t/t4001-diff-rename.sh | 38 +++++++++++++++++++++-----------------
>  1 file changed, 21 insertions(+), 17 deletions(-)
> 
> diff --git a/t/t4001-diff-rename.sh b/t/t4001-diff-rename.sh
> index 2f327b7..bfb364c 100755
> --- a/t/t4001-diff-rename.sh
> +++ b/t/t4001-diff-rename.sh
> @@ -9,7 +9,9 @@ test_description='Test rename detection in diff engine.
>  . ./test-lib.sh
>  . "$TEST_DIRECTORY"/diff-lib.sh
>  
> -echo >path0 'Line 1
> +test_expect_success 'setup' '
> +	cat >path0 <<\EOF &&
> +Line 1
>  Line 2
>  Line 3
>  Line 4

Should we use "<<-" here (and elsewhere) to indent the sample lines? It makes your diff bigger, but I think the end result is much easier to read.

-Peff
Matthieu Moy· Feb 24, 2016, 13:16 UTC · re: Jeff King · lore

Re: [PATCH 2/5] t4001-diff-rename: wrap file creations in a test

Jeff King <peff@peff.net> writes:
Show 24 quoted lines
> On Tue, Feb 23, 2016 at 06:44:55PM +0100, Matthieu Moy wrote:
>
>> Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
>> ---
>>  t/t4001-diff-rename.sh | 38 +++++++++++++++++++++-----------------
>>  1 file changed, 21 insertions(+), 17 deletions(-)
>> 
>> diff --git a/t/t4001-diff-rename.sh b/t/t4001-diff-rename.sh
>> index 2f327b7..bfb364c 100755
>> --- a/t/t4001-diff-rename.sh
>> +++ b/t/t4001-diff-rename.sh
>> @@ -9,7 +9,9 @@ test_description='Test rename detection in diff engine.
>>  . ./test-lib.sh
>>  . "$TEST_DIRECTORY"/diff-lib.sh
>>  
>> -echo >path0 'Line 1
>> +test_expect_success 'setup' '
>> +	cat >path0 <<\EOF &&
>> +Line 1
>>  Line 2
>>  Line 3
>>  Line 4
>
> Should we use "<<-" here (and elsewhere) to indent the sample lines?

I did not use it because I thought it would strip the leading space (' '), but actually it strips only tabs so we can definitely use it.

I changed it to <<- and pushed it here: https://github.com/moy/git/commits/set-diff-renames

I'll resend later.
-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/
Matthieu Moy· Feb 23, 2016, 17:44 UTC · re: Matthieu Moy · lore

[PATCH 3/5] t: add tests for diff.renames (true/false/unset)

The underlying machinery is well-tested, but the configuration option itself was tested only in t3400-rebase.sh.

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
---
 t/t4001-diff-rename.sh | 61 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 60 insertions(+), 1 deletion(-)
Show changes to t/t4001-diff-rename.sh +58 −1
diff --git a/t/t4001-diff-rename.sh b/t/t4001-diff-rename.sh
index bfb364c..6844906 100755
--- a/t/t4001-diff-rename.sh
+++ b/t/t4001-diff-rename.sh
@@ -27,7 +27,7 @@ Line 13
 Line 14
 Line 15
 EOF
-	cat >expected <<\EOF
+	cat >expected <<\EOF &&
 diff --git a/path0 b/path1
 rename from path0
 rename to path1
@@ -43,6 +43,50 @@ rename to path1
  Line 13
  Line 14
 EOF
+	cat >no-rename <<\EOF
+diff --git a/path0 b/path0
+deleted file mode 100644
+index fdbec44..0000000
+--- a/path0
++++ /dev/null
+@@ -1,15 +0,0 @@
+-Line 1
+-Line 2
+-Line 3
+-Line 4
+-Line 5
+-Line 6
+-Line 7
+-Line 8
+-Line 9
+-Line 10
+-line 11
+-Line 12
+-Line 13
+-Line 14
+-Line 15
+diff --git a/path1 b/path1
+new file mode 100644
+index 0000000..752c50e
+--- /dev/null
++++ b/path1
+@@ -0,0 +1,15 @@
++Line 1
++Line 2
++Line 3
++Line 4
++Line 5
++Line 6
++Line 7
++Line 8
++Line 9
++Line 10
++Line 11
++Line 12
++Line 13
++Line 14
++Line 15
+EOF
 '
 
 test_expect_success \
@@ -68,6 +112,21 @@ test_expect_success \
     'validate the output.' \
     'compare_diff_patch current expected'
 
+test_expect_success 'test diff.renames=true' '
+	git -c diff.renames=true diff --cached $tree >current &&
+	compare_diff_patch current expected
+'
+
+test_expect_success 'test diff.renames=false' '
+	git -c diff.renames=false diff --cached $tree >current &&
+	compare_diff_patch current no-rename
+'
+
+test_expect_success 'test diff.renames unset' '
+	git diff --cached $tree >current &&
+	compare_diff_patch current no-rename
+'
+
 test_expect_success 'favour same basenames over different ones' '
 	cp path1 another-path &&
 	git add another-path &&
-- 
2.7.2.334.g35ed2ae.dirty
Matthieu Moy· Feb 23, 2016, 17:44 UTC · re: Matthieu Moy · lore

[PATCH 4/5] log: introduce init_log_defaults()

This is currently a wrapper around init_grep_defaults(), but will allow adding more initialization in further patches.

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
---
 builtin/log.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)
Show changes to builtin/log.c +10 −5
diff --git a/builtin/log.c b/builtin/log.c
index 0d738d6..7f96c64 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -100,6 +100,11 @@ static int log_line_range_callback(const struct option *option, const char *arg,
 	return 0;
 }
 
+static void init_log_defaults()
+{
+	init_grep_defaults();
+}
+
 static void cmd_log_init_defaults(struct rev_info *rev)
 {
 	if (fmt_pretty)
@@ -416,7 +421,7 @@ int cmd_whatchanged(int argc, const char **argv, const char *prefix)
 	struct rev_info rev;
 	struct setup_revision_opt opt;
 
-	init_grep_defaults();
+	init_log_defaults();
 	git_config(git_log_config, NULL);
 
 	init_revisions(&rev, prefix);
@@ -527,7 +532,7 @@ int cmd_show(int argc, const char **argv, const char *prefix)
 	struct pathspec match_all;
 	int i, count, ret = 0;
 
-	init_grep_defaults();
+	init_log_defaults();
 	git_config(git_log_config, NULL);
 
 	memset(&match_all, 0, sizeof(match_all));
@@ -608,7 +613,7 @@ int cmd_log_reflog(int argc, const char **argv, const char *prefix)
 	struct rev_info rev;
 	struct setup_revision_opt opt;
 
-	init_grep_defaults();
+	init_log_defaults();
 	git_config(git_log_config, NULL);
 
 	init_revisions(&rev, prefix);
@@ -647,7 +652,7 @@ int cmd_log(int argc, const char **argv, const char *prefix)
 	struct rev_info rev;
 	struct setup_revision_opt opt;
 
-	init_grep_defaults();
+	init_log_defaults();
 	git_config(git_log_config, NULL);
 
 	init_revisions(&rev, prefix);
@@ -1280,7 +1285,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
 	extra_hdr.strdup_strings = 1;
 	extra_to.strdup_strings = 1;
 	extra_cc.strdup_strings = 1;
-	init_grep_defaults();
+	init_log_defaults();
 	git_config(git_format_config, NULL);
 	init_revisions(&rev, prefix);
 	rev.commit_format = CMIT_FMT_EMAIL;
-- 
2.7.2.334.g35ed2ae.dirty
Matthieu Moy· Feb 23, 2016, 17:44 UTC · re: Matthieu Moy · lore

[PATCH 5/5] diff: activate diff.renames by default

Rename detection is a very convenient feature, and new users shouldn't have to dig in the documentation to benefit from it.

Potential objections to activating rename detection are that it sometimes fail, and it is sometimes slow. But rename detection is already activated by default in several cases like "git status" and "git merge", so activating diff.renames does not fundamentally change the situation. When the rename detection fails, it now fails consistently between "git diff" and "git status".

This setting does not affect plumbing commands, hence well-written scripts will not be affected.

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
---
 Documentation/diff-config.txt | 2 +-
 builtin/commit.c              | 1 +
 builtin/diff.c                | 1 +
 builtin/log.c                 | 1 +
 builtin/merge.c               | 1 +
 diff.c                        | 5 +++++
 diff.h                        | 1 +
 t/t4001-diff-rename.sh        | 2 +-
 t/t4013-diff-various.sh       | 2 ++
 t/t4014-format-patch.sh       | 4 ++--
 t/t4047-diff-dirstat.sh       | 3 ++-
 t/t4202-log.sh                | 8 ++++----
 12 files changed, 22 insertions(+), 9 deletions(-)
Show changes to 12 files +22 −9

Documentation/diff-config.txt, builtin/commit.c, builtin/diff.c, builtin/log.c, builtin/merge.c, diff.c, diff.h, t/t4001-diff-rename.sh, t/t4013-diff-various.sh, t/t4014-format-patch.sh, t/t4047-diff-dirstat.sh, t/t4202-log.sh

diff --git a/Documentation/diff-config.txt b/Documentation/diff-config.txt
index 1acd203..fdf5a79 100644
--- a/Documentation/diff-config.txt
+++ b/Documentation/diff-config.txt
@@ -111,7 +111,7 @@ diff.renames::
 	Whether and how Git detects renames.  If set to "false",
 	rename detection is disabled. If set to "true", basic rename
 	detection is enable.  If set to "copies" or "copy", Git will
-	detect copies, as well.  Defaults to false.
+	detect copies, as well.  Defaults to true.
 
 diff.suppressBlankEmpty::
 	A boolean to inhibit the standard behavior of printing a space
diff --git a/builtin/commit.c b/builtin/commit.c
index b3bd2d4..3cb4843 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -186,6 +186,7 @@ static void status_init_config(struct wt_status *s, config_fn_t fn)
 	gitmodules_config();
 	git_config(fn, s);
 	determine_whence(s);
+	git_diff_ui_default_config();
 	s->hints = advice_status_hints; /* must come after git_config() */
 }
 
diff --git a/builtin/diff.c b/builtin/diff.c
index 52c98a9..8bd1fd5 100644
--- a/builtin/diff.c
+++ b/builtin/diff.c
@@ -318,6 +318,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
 
 	if (!no_index)
 		gitmodules_config();
+	git_diff_ui_default_config();
 	git_config(git_diff_ui_config, NULL);
 
 	init_revisions(&rev, prefix);
diff --git a/builtin/log.c b/builtin/log.c
index 7f96c64..6e34df3 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -103,6 +103,7 @@ static int log_line_range_callback(const struct option *option, const char *arg,
 static void init_log_defaults()
 {
 	init_grep_defaults();
+	git_diff_ui_default_config();
 }
 
 static void cmd_log_init_defaults(struct rev_info *rev)
diff --git a/builtin/merge.c b/builtin/merge.c
index b98a348..cf297d4 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -1187,6 +1187,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
 	else
 		head_commit = lookup_commit_or_die(head_sha1, "HEAD");
 
+	git_diff_ui_default_config();
 	git_config(git_merge_config, NULL);
 
 	if (branch_mergeoptions)
diff --git a/diff.c b/diff.c
index 2136b69..d5db898 100644
--- a/diff.c
+++ b/diff.c
@@ -168,6 +168,11 @@ long parse_algorithm_value(const char *value)
  * never be affected by the setting of diff.renames
  * the user happens to have in the configuration file.
  */
+void git_diff_ui_default_config()
+{
+	diff_detect_rename_default = 1;
+}
+
 int git_diff_ui_config(const char *var, const char *value, void *cb)
 {
 	if (!strcmp(var, "diff.color") || !strcmp(var, "color.diff")) {
diff --git a/diff.h b/diff.h
index 70b2d70..75686d5 100644
--- a/diff.h
+++ b/diff.h
@@ -266,6 +266,7 @@ extern int parse_long_opt(const char *opt, const char **argv,
 			 const char **optarg);
 
 extern int git_diff_basic_config(const char *var, const char *value, void *cb);
+extern void git_diff_ui_default_config();
 extern int git_diff_ui_config(const char *var, const char *value, void *cb);
 extern void diff_setup(struct diff_options *);
 extern int diff_opt_parse(struct diff_options *, const char **, int, const char *);
diff --git a/t/t4001-diff-rename.sh b/t/t4001-diff-rename.sh
index 6844906..15d99a3 100755
--- a/t/t4001-diff-rename.sh
+++ b/t/t4001-diff-rename.sh
@@ -124,7 +124,7 @@ test_expect_success 'test diff.renames=false' '
 
 test_expect_success 'test diff.renames unset' '
 	git diff --cached $tree >current &&
-	compare_diff_patch current no-rename
+	compare_diff_patch current expected
 '
 
 test_expect_success 'favour same basenames over different ones' '
diff --git a/t/t4013-diff-various.sh b/t/t4013-diff-various.sh
index 6ec6072..94ef500 100755
--- a/t/t4013-diff-various.sh
+++ b/t/t4013-diff-various.sh
@@ -90,6 +90,8 @@ test_expect_success setup '
 	git commit -m "Rearranged lines in dir/sub" &&
 	git checkout master &&
 
+	git config diff.renames false &&
+
 	git show-branch
 '
 
diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh
index 3b99434..eed2981 100755
--- a/t/t4014-format-patch.sh
+++ b/t/t4014-format-patch.sh
@@ -549,7 +549,7 @@ test_expect_success 'cover-letter inherits diff options' '
 
 	git mv file foo &&
 	git commit -m foo &&
-	git format-patch --cover-letter -1 &&
+	git format-patch --no-renames --cover-letter -1 &&
 	check_patch 0000-cover-letter.patch &&
 	! grep "file => foo .* 0 *\$" 0000-cover-letter.patch &&
 	git format-patch --cover-letter -1 -M &&
@@ -703,7 +703,7 @@ test_expect_success 'options no longer allowed for format-patch' '
 
 test_expect_success 'format-patch --numstat should produce a patch' '
 	git format-patch --numstat --stdout master..side > output &&
-	test 6 = $(grep "^diff --git a/" output | wc -l)'
+	test 5 = $(grep "^diff --git a/" output | wc -l)'
 
 test_expect_success 'format-patch -- <path>' '
 	git format-patch master..side -- file 2>error &&
diff --git a/t/t4047-diff-dirstat.sh b/t/t4047-diff-dirstat.sh
index 3b8b792..447a8ff 100755
--- a/t/t4047-diff-dirstat.sh
+++ b/t/t4047-diff-dirstat.sh
@@ -248,7 +248,8 @@ EOF
 	git rm -r src/move/unchanged &&
 	git rm -r src/move/changed &&
 	git rm -r src/move/rearranged &&
-	git commit -m "changes"
+	git commit -m "changes" &&
+	git config diff.renames false
 '
 
 cat <<EOF >expect_diff_stat
diff --git a/t/t4202-log.sh b/t/t4202-log.sh
index cb82eb7..128ba93 100755
--- a/t/t4202-log.sh
+++ b/t/t4202-log.sh
@@ -101,8 +101,8 @@ test_expect_success 'oneline' '
 
 test_expect_success 'diff-filter=A' '
 
-	git log --pretty="format:%s" --diff-filter=A HEAD > actual &&
-	git log --pretty="format:%s" --diff-filter A HEAD > actual-separate &&
+	git log --no-renames --pretty="format:%s" --diff-filter=A HEAD > actual &&
+	git log --no-renames --pretty="format:%s" --diff-filter A HEAD > actual-separate &&
 	printf "fifth\nfourth\nthird\ninitial" > expect &&
 	test_cmp expect actual &&
 	test_cmp expect actual-separate
@@ -119,7 +119,7 @@ test_expect_success 'diff-filter=M' '
 
 test_expect_success 'diff-filter=D' '
 
-	actual=$(git log --pretty="format:%s" --diff-filter=D HEAD) &&
+	actual=$(git log --no-renames --pretty="format:%s" --diff-filter=D HEAD) &&
 	expect=$(echo sixth ; echo third) &&
 	verbose test "$actual" = "$expect"
 
@@ -848,7 +848,7 @@ sanitize_output () {
 }
 
 test_expect_success 'log --graph with diff and stats' '
-	git log --graph --pretty=short --stat -p >actual &&
+	git log --no-renames --graph --pretty=short --stat -p >actual &&
 	sanitize_output >actual.sanitized <actual &&
 	test_i18ncmp expect actual.sanitized
 '
-- 
2.7.2.334.g35ed2ae.dirty
Junio C Hamano· Feb 23, 2016, 21:01 UTC · re: Matthieu Moy · lore

Re: [PATCH 5/5] diff: activate diff.renames by default

Matthieu Moy <Matthieu.Moy@imag.fr> writes:
Show 10 quoted lines
> diff --git a/builtin/log.c b/builtin/log.c
> index 7f96c64..6e34df3 100644
> --- a/builtin/log.c
> +++ b/builtin/log.c
> @@ -103,6 +103,7 @@ static int log_line_range_callback(const struct option *option, const char *arg,
>  static void init_log_defaults()
>  {
>  	init_grep_defaults();
> +	git_diff_ui_default_config();
>  }
Why isn't the new function called init_diff_ui_defaults()?
Show 9 quoted lines
> diff --git a/diff.c b/diff.c
> index 2136b69..d5db898 100644
> --- a/diff.c
> +++ b/diff.c
> @@ -168,6 +168,11 @@ long parse_algorithm_value(const char *value)
>   * never be affected by the setting of diff.renames
>   * the user happens to have in the configuration file.
>   */
> +void git_diff_ui_default_config()
s/()/(void)/;  same for the declaration in the header file.
Matthieu Moy· Feb 23, 2016, 21:11 UTC · re: Junio C Hamano · lore

Re: [PATCH 5/5] diff: activate diff.renames by default

Junio C Hamano <gitster@pobox.com> writes:
Show 14 quoted lines
> Matthieu Moy <Matthieu.Moy@imag.fr> writes:
>
>> diff --git a/builtin/log.c b/builtin/log.c
>> index 7f96c64..6e34df3 100644
>> --- a/builtin/log.c
>> +++ b/builtin/log.c
>> @@ -103,6 +103,7 @@ static int log_line_range_callback(const struct option *option, const char *arg,
>>  static void init_log_defaults()
>>  {
>>  	init_grep_defaults();
>> +	git_diff_ui_default_config();
>>  }
>
> Why isn't the new function called init_diff_ui_defaults()?
Indeed, that's a better name. I changed it.
Show 11 quoted lines
>> diff --git a/diff.c b/diff.c
>> index 2136b69..d5db898 100644
>> --- a/diff.c
>> +++ b/diff.c
>> @@ -168,6 +168,11 @@ long parse_algorithm_value(const char *value)
>>   * never be affected by the setting of diff.renames
>>   * the user happens to have in the configuration file.
>>   */
>> +void git_diff_ui_default_config()
>
> s/()/(void)/;  same for the declaration in the header file.
Fixed. 'doing too much C++ and not enough C ;-).
-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/
Jeff King· Feb 24, 2016, 10:42 UTC · re: Matthieu Moy · lore

Re: [PATCH 5/5] diff: activate diff.renames by default

On Tue, Feb 23, 2016 at 06:44:58PM +0100, Matthieu Moy wrote:
Show 10 quoted lines
> diff --git a/Documentation/diff-config.txt b/Documentation/diff-config.txt
> index 1acd203..fdf5a79 100644
> --- a/Documentation/diff-config.txt
> +++ b/Documentation/diff-config.txt
> @@ -111,7 +111,7 @@ diff.renames::
>  	Whether and how Git detects renames.  If set to "false",
>  	rename detection is disabled. If set to "true", basic rename
>  	detection is enable.  If set to "copies" or "copy", Git will
> -	detect copies, as well.  Defaults to false.
> +	detect copies, as well.  Defaults to true.

I wonder if we need to talk about plumbing versus porcelain here, as it does not default to true for diff-tree, for example. But I guess that is already the case (even setting it to true yourself does not affect diff-tree).

-Peff
Matthieu Moy· Feb 25, 2016, 08:54 UTC · re: Jeff King · lore

Re: [PATCH 5/5] diff: activate diff.renames by default

Jeff King <peff@peff.net> writes:
Show 17 quoted lines
> On Tue, Feb 23, 2016 at 06:44:58PM +0100, Matthieu Moy wrote:
>
>> diff --git a/Documentation/diff-config.txt b/Documentation/diff-config.txt
>> index 1acd203..fdf5a79 100644
>> --- a/Documentation/diff-config.txt
>> +++ b/Documentation/diff-config.txt
>> @@ -111,7 +111,7 @@ diff.renames::
>>  	Whether and how Git detects renames.  If set to "false",
>>  	rename detection is disabled. If set to "true", basic rename
>>  	detection is enable.  If set to "copies" or "copy", Git will
>> -	detect copies, as well.  Defaults to false.
>> +	detect copies, as well.  Defaults to true.
>
> I wonder if we need to talk about plumbing versus porcelain here, as it
> does not default to true for diff-tree, for example. But I guess that is
> already the case (even setting it to true yourself does not affect
> diff-tree).

Yes, it was already the case. But it doesn't harm to document it while we're there. I've added this in v2:

        Note that this
	affects only 'git diff' Porcelain like linkgit:git-diff[1] and
	linkgit:git-log[1], and not lower level commands such as
	linkgit:git-diff-files[1].
-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/
Junio C Hamano· Feb 23, 2016, 19:17 UTC · re: Matthieu Moy · lore

Re: [PATCH 0/5] activate diff.renames by default

Matthieu Moy <Matthieu.Moy@imag.fr> writes:
Show 7 quoted lines
> I have always wondered why diff.renames was not activated by default.
> I've had it to true in my configuration for 9 years, and I've been
> teaching newbies to set it for a while without issue. I think it's
> time to activate it by default, but please let me know if I missed a
> reason to keep it to false.
>
> In any case, the first 3 patches are useful cleanups.

It's a long time coming since I heard "I love how I can just say 'oh, keep in mind that we might want to..' and 24 hours later you did it." [*1*]

I can hardly be an impartial judge for this series, though.
[Reference]
*1* http://thread.gmane.org/gmane.comp.version-control.git/3541/focus=3702
Show 20 quoted lines
> Matthieu Moy (5):
>   Documentation/diff-config: fix description of diff.renames
>   t4001-diff-rename: wrap file creations in a test
>   t: add tests for diff.renames (true/false/unset)
>   log: introduce init_log_defaults()
>   diff: activate diff.renames by default
>
>  Documentation/diff-config.txt |  7 ++--
>  builtin/commit.c              |  1 +
>  builtin/diff.c                |  1 +
>  builtin/log.c                 | 16 ++++---
>  builtin/merge.c               |  1 +
>  diff.c                        |  5 +++
>  diff.h                        |  1 +
>  t/t4001-diff-rename.sh        | 97 +++++++++++++++++++++++++++++++++++--------
>  t/t4013-diff-various.sh       |  2 +
>  t/t4014-format-patch.sh       |  4 +-
>  t/t4047-diff-dirstat.sh       |  3 +-
>  t/t4202-log.sh                |  8 ++--
>  12 files changed, 114 insertions(+), 32 deletions(-)
Matthieu Moy· Feb 23, 2016, 20:46 UTC · re: Junio C Hamano · lore

Re: [PATCH 0/5] activate diff.renames by default

Junio C Hamano <gitster@pobox.com> writes:
Show 19 quoted lines
> Matthieu Moy <Matthieu.Moy@imag.fr> writes:
>
>> I have always wondered why diff.renames was not activated by default.
>> I've had it to true in my configuration for 9 years, and I've been
>> teaching newbies to set it for a while without issue. I think it's
>> time to activate it by default, but please let me know if I missed a
>> reason to keep it to false.
>>
>> In any case, the first 3 patches are useful cleanups.
>
> It's a long time coming since I heard "I love how I can just say
> 'oh, keep in mind that we might want to..' and 24 hours later you
> did it." [*1*]
>
> I can hardly be an impartial judge for this series, though.
>
> [Reference]
>
> *1* http://thread.gmane.org/gmane.comp.version-control.git/3541/focus=3702

I guess there's another reference needed to fully understand your message, and I'm not sure I have it right. Are you refering to the "merge-recursive: test rename threshold option" discussion?

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/
Junio C Hamano· Feb 23, 2016, 21:40 UTC · re: Matthieu Moy · lore

Re: [PATCH 0/5] activate diff.renames by default

Matthieu Moy <Matthieu.Moy@grenoble-inp.fr> writes:
Show 25 quoted lines
> Junio C Hamano <gitster@pobox.com> writes:
>
>> Matthieu Moy <Matthieu.Moy@imag.fr> writes:
>>
>>> I have always wondered why diff.renames was not activated by default.
>>> I've had it to true in my configuration for 9 years, and I've been
>>> teaching newbies to set it for a while without issue. I think it's
>>> time to activate it by default, but please let me know if I missed a
>>> reason to keep it to false.
>>>
>>> In any case, the first 3 patches are useful cleanups.
>>
>> It's a long time coming since I heard "I love how I can just say
>> 'oh, keep in mind that we might want to..' and 24 hours later you
>> did it." [*1*]
>>
>> I can hardly be an impartial judge for this series, though.
>>
>> [Reference]
>>
>> *1* http://thread.gmane.org/gmane.comp.version-control.git/3541/focus=3702
>
> I guess there's another reference needed to fully understand your
> message, and I'm not sure I have it right. Are you refering to the
> "merge-recursive: test rename threshold option" discussion?
Not at all.

I was just mentioning that it would at last be a major achievement, if this can safely turned on by default for everybody, after having invented the machinery and the feature looooong time ago ;-)

Matthieu Moy· Feb 25, 2016, 08:59 UTC · re: Matthieu Moy · lore

[PATCH v2 0/5] activate diff.renames by default

Remarks on v1 applied:
* document that diff.renames applies only to porcelain
* use <<- instead of << in tests
* rename git_diff_ui_default_config to init_diff_ui_defaults
* f() -> f(void)
Interdiff follows:
Show changes to 8 files +87 −81

Documentation/diff-config.txt, builtin/commit.c, builtin/diff.c, builtin/log.c, builtin/merge.c, diff.c, diff.h, t/t4001-diff-rename.sh

diff --git a/Documentation/diff-config.txt b/Documentation/diff-config.txt
index fdf5a79..69389ae 100644
--- a/Documentation/diff-config.txt
+++ b/Documentation/diff-config.txt
@@ -111,7 +111,10 @@ diff.renames::
 	Whether and how Git detects renames.  If set to "false",
 	rename detection is disabled. If set to "true", basic rename
 	detection is enable.  If set to "copies" or "copy", Git will
-	detect copies, as well.  Defaults to true.
+	detect copies, as well.  Defaults to true.  Note that this
+	affects only 'git diff' Porcelain like linkgit:git-diff[1] and
+	linkgit:git-log[1], and not lower level commands such as
+	linkgit:git-diff-files[1].
 
 diff.suppressBlankEmpty::
 	A boolean to inhibit the standard behavior of printing a space
diff --git a/builtin/commit.c b/builtin/commit.c
index 3cb4843..109742e 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -186,7 +186,7 @@ static void status_init_config(struct wt_status *s, config_fn_t fn)
 	gitmodules_config();
 	git_config(fn, s);
 	determine_whence(s);
-	git_diff_ui_default_config();
+	init_diff_ui_defaults();
 	s->hints = advice_status_hints; /* must come after git_config() */
 }
 
diff --git a/builtin/diff.c b/builtin/diff.c
index 8bd1fd5..343c6b8 100644
--- a/builtin/diff.c
+++ b/builtin/diff.c
@@ -318,7 +318,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
 
 	if (!no_index)
 		gitmodules_config();
-	git_diff_ui_default_config();
+	init_diff_ui_defaults();
 	git_config(git_diff_ui_config, NULL);
 
 	init_revisions(&rev, prefix);
diff --git a/builtin/log.c b/builtin/log.c
index 6e34df3..c05a5f6 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -103,7 +103,7 @@ static int log_line_range_callback(const struct option *option, const char *arg,
 static void init_log_defaults()
 {
 	init_grep_defaults();
-	git_diff_ui_default_config();
+	init_diff_ui_defaults();
 }
 
 static void cmd_log_init_defaults(struct rev_info *rev)
diff --git a/builtin/merge.c b/builtin/merge.c
index cf297d4..4cb4f6a 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -1187,7 +1187,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
 	else
 		head_commit = lookup_commit_or_die(head_sha1, "HEAD");
 
-	git_diff_ui_default_config();
+	init_diff_ui_defaults();
 	git_config(git_merge_config, NULL);
 
 	if (branch_mergeoptions)
diff --git a/diff.c b/diff.c
index d5db898..b4dea07 100644
--- a/diff.c
+++ b/diff.c
@@ -168,7 +168,7 @@ long parse_algorithm_value(const char *value)
  * never be affected by the setting of diff.renames
  * the user happens to have in the configuration file.
  */
-void git_diff_ui_default_config()
+void init_diff_ui_defaults(void)
 {
 	diff_detect_rename_default = 1;
 }
diff --git a/diff.h b/diff.h
index 75686d5..0a3ce86 100644
--- a/diff.h
+++ b/diff.h
@@ -266,7 +266,7 @@ extern int parse_long_opt(const char *opt, const char **argv,
 			 const char **optarg);
 
 extern int git_diff_basic_config(const char *var, const char *value, void *cb);
-extern void git_diff_ui_default_config();
+extern void init_diff_ui_defaults(void);
 extern int git_diff_ui_config(const char *var, const char *value, void *cb);
 extern void diff_setup(struct diff_options *);
 extern int diff_opt_parse(struct diff_options *, const char **, int, const char *);
diff --git a/t/t4001-diff-rename.sh b/t/t4001-diff-rename.sh
index 15d99a3..c7e58b6 100755
--- a/t/t4001-diff-rename.sh
+++ b/t/t4001-diff-rename.sh
@@ -10,83 +10,83 @@ test_description='Test rename detection in diff engine.
 . "$TEST_DIRECTORY"/diff-lib.sh
 
 test_expect_success 'setup' '
-	cat >path0 <<\EOF &&
-Line 1
-Line 2
-Line 3
-Line 4
-Line 5
-Line 6
-Line 7
-Line 8
-Line 9
-Line 10
-line 11
-Line 12
-Line 13
-Line 14
-Line 15
-EOF
-	cat >expected <<\EOF &&
-diff --git a/path0 b/path1
-rename from path0
-rename to path1
---- a/path0
-+++ b/path1
-@@ -8,7 +8,7 @@ Line 7
- Line 8
- Line 9
- Line 10
--line 11
-+Line 11
- Line 12
- Line 13
- Line 14
-EOF
-	cat >no-rename <<\EOF
-diff --git a/path0 b/path0
-deleted file mode 100644
-index fdbec44..0000000
---- a/path0
-+++ /dev/null
-@@ -1,15 +0,0 @@
--Line 1
--Line 2
--Line 3
--Line 4
--Line 5
--Line 6
--Line 7
--Line 8
--Line 9
--Line 10
--line 11
--Line 12
--Line 13
--Line 14
--Line 15
-diff --git a/path1 b/path1
-new file mode 100644
-index 0000000..752c50e
---- /dev/null
-+++ b/path1
-@@ -0,0 +1,15 @@
-+Line 1
-+Line 2
-+Line 3
-+Line 4
-+Line 5
-+Line 6
-+Line 7
-+Line 8
-+Line 9
-+Line 10
-+Line 11
-+Line 12
-+Line 13
-+Line 14
-+Line 15
-EOF
+	cat >path0 <<-\EOF &&
+	Line 1
+	Line 2
+	Line 3
+	Line 4
+	Line 5
+	Line 6
+	Line 7
+	Line 8
+	Line 9
+	Line 10
+	line 11
+	Line 12
+	Line 13
+	Line 14
+	Line 15
+	EOF
+	cat >expected <<-\EOF &&
+	diff --git a/path0 b/path1
+	rename from path0
+	rename to path1
+	--- a/path0
+	+++ b/path1
+	@@ -8,7 +8,7 @@ Line 7
+	 Line 8
+	 Line 9
+	 Line 10
+	-line 11
+	+Line 11
+	 Line 12
+	 Line 13
+	 Line 14
+	EOF
+	cat >no-rename <<-\EOF
+	diff --git a/path0 b/path0
+	deleted file mode 100644
+	index fdbec44..0000000
+	--- a/path0
+	+++ /dev/null
+	@@ -1,15 +0,0 @@
+	-Line 1
+	-Line 2
+	-Line 3
+	-Line 4
+	-Line 5
+	-Line 6
+	-Line 7
+	-Line 8
+	-Line 9
+	-Line 10
+	-line 11
+	-Line 12
+	-Line 13
+	-Line 14
+	-Line 15
+	diff --git a/path1 b/path1
+	new file mode 100644
+	index 0000000..752c50e
+	--- /dev/null
+	+++ b/path1
+	@@ -0,0 +1,15 @@
+	+Line 1
+	+Line 2
+	+Line 3
+	+Line 4
+	+Line 5
+	+Line 6
+	+Line 7
+	+Line 8
+	+Line 9
+	+Line 10
+	+Line 11
+	+Line 12
+	+Line 13
+	+Line 14
+	+Line 15
+	EOF
 '
 
 test_expect_success \




Matthieu Moy (5):
  Documentation/diff-config: fix description of diff.renames
  t4001-diff-rename: wrap file creations in a test
  t: add tests for diff.renames (true/false/unset)
  log: introduce init_log_defaults()
  diff: activate diff.renames by default

 Documentation/diff-config.txt |  10 +++-
 builtin/commit.c              |   1 +
 builtin/diff.c                |   1 +
 builtin/log.c                 |  16 ++++--
 builtin/merge.c               |   1 +
 diff.c                        |   5 ++
 diff.h                        |   1 +
 t/t4001-diff-rename.sh        | 125 +++++++++++++++++++++++++++++++-----------
 t/t4013-diff-various.sh       |   2 +
 t/t4014-format-patch.sh       |   4 +-
 t/t4047-diff-dirstat.sh       |   3 +-
 t/t4202-log.sh                |   8 +--
 12 files changed, 131 insertions(+), 46 deletions(-)
-- 
2.7.2.334.g35ed2ae.dirty
Matthieu Moy· Feb 25, 2016, 08:59 UTC · re: Matthieu Moy · lore

[PATCH v2 1/5] Documentation/diff-config: fix description of diff.renames

The description was misleading, since "set to any boolean value" include "set to false", and diff.renames=false does not enable basic detection, but actually disables it. Also, document that diff.renames only affects Porcelain.

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
---
 Documentation/diff-config.txt | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)
Show changes to Documentation/diff-config.txt +7 −3
diff --git a/Documentation/diff-config.txt b/Documentation/diff-config.txt
index 6eaa452..40e5de9 100644
--- a/Documentation/diff-config.txt
+++ b/Documentation/diff-config.txt
@@ -108,9 +108,13 @@ diff.renameLimit::
 	detection; equivalent to the 'git diff' option '-l'.
 
 diff.renames::
-	Tells Git to detect renames.  If set to any boolean value, it
-	will enable basic rename detection.  If set to "copies" or
-	"copy", it will detect copies, as well.
+	Whether and how Git detects renames.  If set to "false",
+	rename detection is disabled. If set to "true", basic rename
+	detection is enable.  If set to "copies" or "copy", Git will
+	detect copies, as well.  Defaults to false.  Note that this
+	affects only 'git diff' Porcelain like linkgit:git-diff[1] and
+	linkgit:git-log[1], and not lower level commands such as
+	linkgit:git-diff-files[1].
 
 diff.suppressBlankEmpty::
 	A boolean to inhibit the standard behavior of printing a space
-- 
2.7.2.334.g35ed2ae.dirty
Matthieu Moy· Feb 25, 2016, 17:37 UTC · re: Matthieu Moy · lore

[PATCH v2.1] Documentation/diff-config: fix description of diff.renames

The description was misleading, since "set to any boolean value" include "set to false", and diff.renames=false does not enable basic detection, but actually disables it. Also, document that diff.renames only affects Porcelain.

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
---
Oops, trivial fix for typo noticed by Felipe. I'm resending just this
one in case Junio wants to pick the latest version but I can obviously
resend the whole if needed.
 Documentation/diff-config.txt | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)
Show changes to Documentation/diff-config.txt +7 −3
diff --git a/Documentation/diff-config.txt b/Documentation/diff-config.txt
index 6eaa452..b5e9bda 100644
--- a/Documentation/diff-config.txt
+++ b/Documentation/diff-config.txt
@@ -108,9 +108,13 @@ diff.renameLimit::
 	detection; equivalent to the 'git diff' option '-l'.
 
 diff.renames::
-	Tells Git to detect renames.  If set to any boolean value, it
-	will enable basic rename detection.  If set to "copies" or
-	"copy", it will detect copies, as well.
+	Whether and how Git detects renames.  If set to "false",
+	rename detection is disabled.  If set to "true", basic rename
+	detection is enabled.  If set to "copies" or "copy", Git will
+	detect copies, as well.  Defaults to false.  Note that this
+	affects only 'git diff' Porcelain like linkgit:git-diff[1] and
+	linkgit:git-log[1], and not lower level commands such as
+	linkgit:git-diff-files[1].
 
 diff.suppressBlankEmpty::
 	A boolean to inhibit the standard behavior of printing a space
-- 
2.7.2.334.g35ed2ae.dirty
Junio C Hamano· Feb 25, 2016, 18:18 UTC · re: Matthieu Moy · lore

Re: [PATCH v2.1] Documentation/diff-config: fix description of diff.renames

Matthieu Moy <Matthieu.Moy@imag.fr> writes:
Show 10 quoted lines
> The description was misleading, since "set to any boolean value" include
> "set to false", and diff.renames=false does not enable basic detection,
> but actually disables it. Also, document that diff.renames only affects
> Porcelain.
>
> Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
> ---
> Oops, trivial fix for typo noticed by Felipe. I'm resending just this
> one in case Junio wants to pick the latest version but I can obviously
> resend the whole if needed.

Heh, I guess people independently spotted the same typo nearly simultaneously ;-)

I think I got this fixed locally (and adjusted the last one to match). Thanks.

Show 25 quoted lines
>
>  Documentation/diff-config.txt | 10 +++++++---
>  1 file changed, 7 insertions(+), 3 deletions(-)
>
> diff --git a/Documentation/diff-config.txt b/Documentation/diff-config.txt
> index 6eaa452..b5e9bda 100644
> --- a/Documentation/diff-config.txt
> +++ b/Documentation/diff-config.txt
> @@ -108,9 +108,13 @@ diff.renameLimit::
>  	detection; equivalent to the 'git diff' option '-l'.
>  
>  diff.renames::
> -	Tells Git to detect renames.  If set to any boolean value, it
> -	will enable basic rename detection.  If set to "copies" or
> -	"copy", it will detect copies, as well.
> +	Whether and how Git detects renames.  If set to "false",
> +	rename detection is disabled.  If set to "true", basic rename
> +	detection is enabled.  If set to "copies" or "copy", Git will
> +	detect copies, as well.  Defaults to false.  Note that this
> +	affects only 'git diff' Porcelain like linkgit:git-diff[1] and
> +	linkgit:git-log[1], and not lower level commands such as
> +	linkgit:git-diff-files[1].
>  
>  diff.suppressBlankEmpty::
>  	A boolean to inhibit the standard behavior of printing a space
Junio C Hamano· Feb 25, 2016, 17:53 UTC · re: Matthieu Moy · lore

Re: [PATCH v2 1/5] Documentation/diff-config: fix description of diff.renames

Matthieu Moy <Matthieu.Moy@imag.fr> writes:
Show 24 quoted lines
> The description was misleading, since "set to any boolean value" include
> "set to false", and diff.renames=false does not enable basic detection,
> but actually disables it. Also, document that diff.renames only affects
> Porcelain.
>
> Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
> ---
>  Documentation/diff-config.txt | 10 +++++++---
>  1 file changed, 7 insertions(+), 3 deletions(-)
>
> diff --git a/Documentation/diff-config.txt b/Documentation/diff-config.txt
> index 6eaa452..40e5de9 100644
> --- a/Documentation/diff-config.txt
> +++ b/Documentation/diff-config.txt
> @@ -108,9 +108,13 @@ diff.renameLimit::
>  	detection; equivalent to the 'git diff' option '-l'.
>  
>  diff.renames::
> -	Tells Git to detect renames.  If set to any boolean value, it
> -	will enable basic rename detection.  If set to "copies" or
> -	"copy", it will detect copies, as well.
> +	Whether and how Git detects renames.  If set to "false",
> +	rename detection is disabled. If set to "true", basic rename
> +	detection is enable.  If set to "copies" or "copy", Git will
Ahh, I earlier said "Not a new issue", but it is introduced here ;-)
I'll patch them up.  Thanks.
Show 7 quoted lines
> +	detect copies, as well.  Defaults to false.  Note that this
> +	affects only 'git diff' Porcelain like linkgit:git-diff[1] and
> +	linkgit:git-log[1], and not lower level commands such as
> +	linkgit:git-diff-files[1].
>  
>  diff.suppressBlankEmpty::
>  	A boolean to inhibit the standard behavior of printing a space
Matthieu Moy· Feb 25, 2016, 08:59 UTC · re: Matthieu Moy · lore

[PATCH v2 2/5] t4001-diff-rename: wrap file creations in a test

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
---
 t/t4001-diff-rename.sh | 66 ++++++++++++++++++++++++++------------------------
 1 file changed, 35 insertions(+), 31 deletions(-)
Show changes to t/t4001-diff-rename.sh +35 −30
diff --git a/t/t4001-diff-rename.sh b/t/t4001-diff-rename.sh
index 2f327b7..06b8828 100755
--- a/t/t4001-diff-rename.sh
+++ b/t/t4001-diff-rename.sh
@@ -9,21 +9,40 @@ test_description='Test rename detection in diff engine.
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/diff-lib.sh
 
-echo >path0 'Line 1
-Line 2
-Line 3
-Line 4
-Line 5
-Line 6
-Line 7
-Line 8
-Line 9
-Line 10
-line 11
-Line 12
-Line 13
-Line 14
-Line 15
+test_expect_success 'setup' '
+	cat >path0 <<-\EOF &&
+	Line 1
+	Line 2
+	Line 3
+	Line 4
+	Line 5
+	Line 6
+	Line 7
+	Line 8
+	Line 9
+	Line 10
+	line 11
+	Line 12
+	Line 13
+	Line 14
+	Line 15
+	EOF
+	cat >expected <<-\EOF
+	diff --git a/path0 b/path1
+	rename from path0
+	rename to path1
+	--- a/path0
+	+++ b/path1
+	@@ -8,7 +8,7 @@ Line 7
+	 Line 8
+	 Line 9
+	 Line 10
+	-line 11
+	+Line 11
+	 Line 12
+	 Line 13
+	 Line 14
+	EOF
 '
 
 test_expect_success \
@@ -43,22 +62,7 @@ test_expect_success \
 test_expect_success \
     'git diff-index -p -M after rename and editing.' \
     'git diff-index -p -M $tree >current'
-cat >expected <<\EOF
-diff --git a/path0 b/path1
-rename from path0
-rename to path1
---- a/path0
-+++ b/path1
-@@ -8,7 +8,7 @@ Line 7
- Line 8
- Line 9
- Line 10
--line 11
-+Line 11
- Line 12
- Line 13
- Line 14
-EOF
+
 
 test_expect_success \
     'validate the output.' \
-- 
2.7.2.334.g35ed2ae.dirty
Matthieu Moy· Feb 25, 2016, 08:59 UTC · re: Matthieu Moy · lore

[PATCH v2 3/5] t: add tests for diff.renames (true/false/unset)

The underlying machinery is well-tested, but the configuration option itself was tested only in t3400-rebase.sh.

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
---
 t/t4001-diff-rename.sh | 61 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 60 insertions(+), 1 deletion(-)
Show changes to t/t4001-diff-rename.sh +60 −1
diff --git a/t/t4001-diff-rename.sh b/t/t4001-diff-rename.sh
index 06b8828..f5239b5 100755
--- a/t/t4001-diff-rename.sh
+++ b/t/t4001-diff-rename.sh
@@ -27,7 +27,7 @@ test_expect_success 'setup' '
 	Line 14
 	Line 15
 	EOF
-	cat >expected <<-\EOF
+	cat >expected <<-\EOF &&
 	diff --git a/path0 b/path1
 	rename from path0
 	rename to path1
@@ -43,6 +43,50 @@ test_expect_success 'setup' '
 	 Line 13
 	 Line 14
 	EOF
+	cat >no-rename <<-\EOF
+	diff --git a/path0 b/path0
+	deleted file mode 100644
+	index fdbec44..0000000
+	--- a/path0
+	+++ /dev/null
+	@@ -1,15 +0,0 @@
+	-Line 1
+	-Line 2
+	-Line 3
+	-Line 4
+	-Line 5
+	-Line 6
+	-Line 7
+	-Line 8
+	-Line 9
+	-Line 10
+	-line 11
+	-Line 12
+	-Line 13
+	-Line 14
+	-Line 15
+	diff --git a/path1 b/path1
+	new file mode 100644
+	index 0000000..752c50e
+	--- /dev/null
+	+++ b/path1
+	@@ -0,0 +1,15 @@
+	+Line 1
+	+Line 2
+	+Line 3
+	+Line 4
+	+Line 5
+	+Line 6
+	+Line 7
+	+Line 8
+	+Line 9
+	+Line 10
+	+Line 11
+	+Line 12
+	+Line 13
+	+Line 14
+	+Line 15
+	EOF
 '
 
 test_expect_success \
@@ -68,6 +112,21 @@ test_expect_success \
     'validate the output.' \
     'compare_diff_patch current expected'
 
+test_expect_success 'test diff.renames=true' '
+	git -c diff.renames=true diff --cached $tree >current &&
+	compare_diff_patch current expected
+'
+
+test_expect_success 'test diff.renames=false' '
+	git -c diff.renames=false diff --cached $tree >current &&
+	compare_diff_patch current no-rename
+'
+
+test_expect_success 'test diff.renames unset' '
+	git diff --cached $tree >current &&
+	compare_diff_patch current no-rename
+'
+
 test_expect_success 'favour same basenames over different ones' '
 	cp path1 another-path &&
 	git add another-path &&
-- 
2.7.2.334.g35ed2ae.dirty
Matthieu Moy· Feb 25, 2016, 08:59 UTC · re: Matthieu Moy · lore

[PATCH v2 4/5] log: introduce init_log_defaults()

This is currently a wrapper around init_grep_defaults(), but will allow adding more initialization in further patches.

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
---
 builtin/log.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)
Show changes to builtin/log.c +10 −5
diff --git a/builtin/log.c b/builtin/log.c
index 0d738d6..7f96c64 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -100,6 +100,11 @@ static int log_line_range_callback(const struct option *option, const char *arg,
 	return 0;
 }
 
+static void init_log_defaults()
+{
+	init_grep_defaults();
+}
+
 static void cmd_log_init_defaults(struct rev_info *rev)
 {
 	if (fmt_pretty)
@@ -416,7 +421,7 @@ int cmd_whatchanged(int argc, const char **argv, const char *prefix)
 	struct rev_info rev;
 	struct setup_revision_opt opt;
 
-	init_grep_defaults();
+	init_log_defaults();
 	git_config(git_log_config, NULL);
 
 	init_revisions(&rev, prefix);
@@ -527,7 +532,7 @@ int cmd_show(int argc, const char **argv, const char *prefix)
 	struct pathspec match_all;
 	int i, count, ret = 0;
 
-	init_grep_defaults();
+	init_log_defaults();
 	git_config(git_log_config, NULL);
 
 	memset(&match_all, 0, sizeof(match_all));
@@ -608,7 +613,7 @@ int cmd_log_reflog(int argc, const char **argv, const char *prefix)
 	struct rev_info rev;
 	struct setup_revision_opt opt;
 
-	init_grep_defaults();
+	init_log_defaults();
 	git_config(git_log_config, NULL);
 
 	init_revisions(&rev, prefix);
@@ -647,7 +652,7 @@ int cmd_log(int argc, const char **argv, const char *prefix)
 	struct rev_info rev;
 	struct setup_revision_opt opt;
 
-	init_grep_defaults();
+	init_log_defaults();
 	git_config(git_log_config, NULL);
 
 	init_revisions(&rev, prefix);
@@ -1280,7 +1285,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
 	extra_hdr.strdup_strings = 1;
 	extra_to.strdup_strings = 1;
 	extra_cc.strdup_strings = 1;
-	init_grep_defaults();
+	init_log_defaults();
 	git_config(git_format_config, NULL);
 	init_revisions(&rev, prefix);
 	rev.commit_format = CMIT_FMT_EMAIL;
-- 
2.7.2.334.g35ed2ae.dirty
Junio C Hamano· Feb 25, 2016, 19:31 UTC · re: Matthieu Moy · lore

Re: [PATCH v2 4/5] log: introduce init_log_defaults()

Matthieu Moy <Matthieu.Moy@imag.fr> writes:
Show 17 quoted lines
> This is currently a wrapper around init_grep_defaults(), but will allow
> adding more initialization in further patches.
>
> Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
> ---
>  builtin/log.c | 15 ++++++++++-----
>  1 file changed, 10 insertions(+), 5 deletions(-)
>
> diff --git a/builtin/log.c b/builtin/log.c
> index 0d738d6..7f96c64 100644
> --- a/builtin/log.c
> +++ b/builtin/log.c
> @@ -100,6 +100,11 @@ static int log_line_range_callback(const struct option *option, const char *arg,
>  	return 0;
>  }
>  
> +static void init_log_defaults()
	static void init_log_defaults(void).
Locally patched up already; no need to resend.
Thanks.
Matthieu Moy· Feb 25, 2016, 08:59 UTC · re: Matthieu Moy · lore

[PATCH v2 5/5] diff: activate diff.renames by default

Rename detection is a very convenient feature, and new users shouldn't have to dig in the documentation to benefit from it.

Potential objections to activating rename detection are that it sometimes fail, and it is sometimes slow. But rename detection is already activated by default in several cases like "git status" and "git merge", so activating diff.renames does not fundamentally change the situation. When the rename detection fails, it now fails consistently between "git diff" and "git status".

This setting does not affect plumbing commands, hence well-written scripts will not be affected.

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
---
 Documentation/diff-config.txt | 2 +-
 builtin/commit.c              | 1 +
 builtin/diff.c                | 1 +
 builtin/log.c                 | 1 +
 builtin/merge.c               | 1 +
 diff.c                        | 5 +++++
 diff.h                        | 1 +
 t/t4001-diff-rename.sh        | 2 +-
 t/t4013-diff-various.sh       | 2 ++
 t/t4014-format-patch.sh       | 4 ++--
 t/t4047-diff-dirstat.sh       | 3 ++-
 t/t4202-log.sh                | 8 ++++----
 12 files changed, 22 insertions(+), 9 deletions(-)
Show changes to 12 files +22 −9

Documentation/diff-config.txt, builtin/commit.c, builtin/diff.c, builtin/log.c, builtin/merge.c, diff.c, diff.h, t/t4001-diff-rename.sh, t/t4013-diff-various.sh, t/t4014-format-patch.sh, t/t4047-diff-dirstat.sh, t/t4202-log.sh

diff --git a/Documentation/diff-config.txt b/Documentation/diff-config.txt
index 40e5de9..69389ae 100644
--- a/Documentation/diff-config.txt
+++ b/Documentation/diff-config.txt
@@ -111,7 +111,7 @@ diff.renames::
 	Whether and how Git detects renames.  If set to "false",
 	rename detection is disabled. If set to "true", basic rename
 	detection is enable.  If set to "copies" or "copy", Git will
-	detect copies, as well.  Defaults to false.  Note that this
+	detect copies, as well.  Defaults to true.  Note that this
 	affects only 'git diff' Porcelain like linkgit:git-diff[1] and
 	linkgit:git-log[1], and not lower level commands such as
 	linkgit:git-diff-files[1].
diff --git a/builtin/commit.c b/builtin/commit.c
index b3bd2d4..109742e 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -186,6 +186,7 @@ static void status_init_config(struct wt_status *s, config_fn_t fn)
 	gitmodules_config();
 	git_config(fn, s);
 	determine_whence(s);
+	init_diff_ui_defaults();
 	s->hints = advice_status_hints; /* must come after git_config() */
 }
 
diff --git a/builtin/diff.c b/builtin/diff.c
index 52c98a9..343c6b8 100644
--- a/builtin/diff.c
+++ b/builtin/diff.c
@@ -318,6 +318,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
 
 	if (!no_index)
 		gitmodules_config();
+	init_diff_ui_defaults();
 	git_config(git_diff_ui_config, NULL);
 
 	init_revisions(&rev, prefix);
diff --git a/builtin/log.c b/builtin/log.c
index 7f96c64..c05a5f6 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -103,6 +103,7 @@ static int log_line_range_callback(const struct option *option, const char *arg,
 static void init_log_defaults()
 {
 	init_grep_defaults();
+	init_diff_ui_defaults();
 }
 
 static void cmd_log_init_defaults(struct rev_info *rev)
diff --git a/builtin/merge.c b/builtin/merge.c
index b98a348..4cb4f6a 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -1187,6 +1187,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
 	else
 		head_commit = lookup_commit_or_die(head_sha1, "HEAD");
 
+	init_diff_ui_defaults();
 	git_config(git_merge_config, NULL);
 
 	if (branch_mergeoptions)
diff --git a/diff.c b/diff.c
index 2136b69..b4dea07 100644
--- a/diff.c
+++ b/diff.c
@@ -168,6 +168,11 @@ long parse_algorithm_value(const char *value)
  * never be affected by the setting of diff.renames
  * the user happens to have in the configuration file.
  */
+void init_diff_ui_defaults(void)
+{
+	diff_detect_rename_default = 1;
+}
+
 int git_diff_ui_config(const char *var, const char *value, void *cb)
 {
 	if (!strcmp(var, "diff.color") || !strcmp(var, "color.diff")) {
diff --git a/diff.h b/diff.h
index 70b2d70..0a3ce86 100644
--- a/diff.h
+++ b/diff.h
@@ -266,6 +266,7 @@ extern int parse_long_opt(const char *opt, const char **argv,
 			 const char **optarg);
 
 extern int git_diff_basic_config(const char *var, const char *value, void *cb);
+extern void init_diff_ui_defaults(void);
 extern int git_diff_ui_config(const char *var, const char *value, void *cb);
 extern void diff_setup(struct diff_options *);
 extern int diff_opt_parse(struct diff_options *, const char **, int, const char *);
diff --git a/t/t4001-diff-rename.sh b/t/t4001-diff-rename.sh
index f5239b5..c7e58b6 100755
--- a/t/t4001-diff-rename.sh
+++ b/t/t4001-diff-rename.sh
@@ -124,7 +124,7 @@ test_expect_success 'test diff.renames=false' '
 
 test_expect_success 'test diff.renames unset' '
 	git diff --cached $tree >current &&
-	compare_diff_patch current no-rename
+	compare_diff_patch current expected
 '
 
 test_expect_success 'favour same basenames over different ones' '
diff --git a/t/t4013-diff-various.sh b/t/t4013-diff-various.sh
index 6ec6072..94ef500 100755
--- a/t/t4013-diff-various.sh
+++ b/t/t4013-diff-various.sh
@@ -90,6 +90,8 @@ test_expect_success setup '
 	git commit -m "Rearranged lines in dir/sub" &&
 	git checkout master &&
 
+	git config diff.renames false &&
+
 	git show-branch
 '
 
diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh
index 3b99434..eed2981 100755
--- a/t/t4014-format-patch.sh
+++ b/t/t4014-format-patch.sh
@@ -549,7 +549,7 @@ test_expect_success 'cover-letter inherits diff options' '
 
 	git mv file foo &&
 	git commit -m foo &&
-	git format-patch --cover-letter -1 &&
+	git format-patch --no-renames --cover-letter -1 &&
 	check_patch 0000-cover-letter.patch &&
 	! grep "file => foo .* 0 *\$" 0000-cover-letter.patch &&
 	git format-patch --cover-letter -1 -M &&
@@ -703,7 +703,7 @@ test_expect_success 'options no longer allowed for format-patch' '
 
 test_expect_success 'format-patch --numstat should produce a patch' '
 	git format-patch --numstat --stdout master..side > output &&
-	test 6 = $(grep "^diff --git a/" output | wc -l)'
+	test 5 = $(grep "^diff --git a/" output | wc -l)'
 
 test_expect_success 'format-patch -- <path>' '
 	git format-patch master..side -- file 2>error &&
diff --git a/t/t4047-diff-dirstat.sh b/t/t4047-diff-dirstat.sh
index 3b8b792..447a8ff 100755
--- a/t/t4047-diff-dirstat.sh
+++ b/t/t4047-diff-dirstat.sh
@@ -248,7 +248,8 @@ EOF
 	git rm -r src/move/unchanged &&
 	git rm -r src/move/changed &&
 	git rm -r src/move/rearranged &&
-	git commit -m "changes"
+	git commit -m "changes" &&
+	git config diff.renames false
 '
 
 cat <<EOF >expect_diff_stat
diff --git a/t/t4202-log.sh b/t/t4202-log.sh
index cb82eb7..128ba93 100755
--- a/t/t4202-log.sh
+++ b/t/t4202-log.sh
@@ -101,8 +101,8 @@ test_expect_success 'oneline' '
 
 test_expect_success 'diff-filter=A' '
 
-	git log --pretty="format:%s" --diff-filter=A HEAD > actual &&
-	git log --pretty="format:%s" --diff-filter A HEAD > actual-separate &&
+	git log --no-renames --pretty="format:%s" --diff-filter=A HEAD > actual &&
+	git log --no-renames --pretty="format:%s" --diff-filter A HEAD > actual-separate &&
 	printf "fifth\nfourth\nthird\ninitial" > expect &&
 	test_cmp expect actual &&
 	test_cmp expect actual-separate
@@ -119,7 +119,7 @@ test_expect_success 'diff-filter=M' '
 
 test_expect_success 'diff-filter=D' '
 
-	actual=$(git log --pretty="format:%s" --diff-filter=D HEAD) &&
+	actual=$(git log --no-renames --pretty="format:%s" --diff-filter=D HEAD) &&
 	expect=$(echo sixth ; echo third) &&
 	verbose test "$actual" = "$expect"
 
@@ -848,7 +848,7 @@ sanitize_output () {
 }
 
 test_expect_success 'log --graph with diff and stats' '
-	git log --graph --pretty=short --stat -p >actual &&
+	git log --no-renames --graph --pretty=short --stat -p >actual &&
 	sanitize_output >actual.sanitized <actual &&
 	test_i18ncmp expect actual.sanitized
 '
-- 
2.7.2.334.g35ed2ae.dirty
Junio C Hamano· Feb 25, 2016, 17:52 UTC · re: Matthieu Moy · lore

Re: [PATCH v2 5/5] diff: activate diff.renames by default

Matthieu Moy <Matthieu.Moy@imag.fr> writes:
Show 8 quoted lines
> diff --git a/Documentation/diff-config.txt b/Documentation/diff-config.txt
> index 40e5de9..69389ae 100644
> --- a/Documentation/diff-config.txt
> +++ b/Documentation/diff-config.txt
> @@ -111,7 +111,7 @@ diff.renames::
>  	Whether and how Git detects renames.  If set to "false",
>  	rename detection is disabled. If set to "true", basic rename
>  	detection is enable.  If set to "copies" or "copy", Git will
Not a new issue, but s/enable/&d/, I think.
Show 5 quoted lines
> -	detect copies, as well.  Defaults to false.  Note that this
> +	detect copies, as well.  Defaults to true.  Note that this
>  	affects only 'git diff' Porcelain like linkgit:git-diff[1] and
>  	linkgit:git-log[1], and not lower level commands such as
>  	linkgit:git-diff-files[1].

← back to recent threads