diff: activate diff.renames by default
authorMatthieu Moy <Matthieu.Moy@imag.fr>
Thu, 25 Feb 2016 08:59:21 +0000 (09:59 +0100)
committerJunio C Hamano <gitster@pobox.com>
Thu, 25 Feb 2016 19:31:02 +0000 (11:31 -0800)
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>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
12 files changed:
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
index cf4a9159bfcb48be657871c7d5ffe48c91878b91..edba56522bce6e868eb04ad03987d8b078ac907e 100644 (file)
@@ -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 enabled.  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].
index b3bd2d41813f80d848afc199c2fae92cae6b6c11..109742e2806c445584995e4fd7b6cf29323fef97 100644 (file)
@@ -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() */
 }
 
index 52c98a9217c60a60f0012dbdafbb193e78ec8a33..343c6b8f2522a295a6148434572e77a3a3c5a16b 100644 (file)
@@ -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);
index d83d47a9c4aabc4206ef424a8678223c398a5c7a..9430b80e5e18c99bec41d4b4813a24def5bfe07a 100644 (file)
@@ -103,6 +103,7 @@ static int log_line_range_callback(const struct option *option, const char *arg,
 static void init_log_defaults(void)
 {
        init_grep_defaults();
+       init_diff_ui_defaults();
 }
 
 static void cmd_log_init_defaults(struct rev_info *rev)
index b98a3489bf24c0726b3847704e7ec0b658a79e51..4cb4f6aa8682329daf154e5f86a5678aa9236417 100644 (file)
@@ -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 2136b6970b3a9751a3ec420bac61e9baa08df9b0..b4dea07db9f35a563c175bb0b56419378ed2adc4 100644 (file)
--- 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 70b2d70d64e1e47da617f51b8385870a22e92f40..0a3ce8658d53452dac286891d34b3447f1dfd88f 100644 (file)
--- 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 *);
index f5239b525aef9e85b8bcc295be02aa42a7155968..c7e58b69a92fb464059f99ad298b9147946bf702 100755 (executable)
@@ -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' '
index 6ec607211803d2685b109b7fc0d926d206bbf1d4..94ef5000e787f0898ff6ccb57661c972c765db52 100755 (executable)
@@ -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
 '
 
index 3b99434e3e6f534efe44850fef3d1d77c04f5856..eed2981b96df71c6acdc0f90f8b477561241a9a3 100755 (executable)
@@ -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 &&
index 3b8b7921d60c75c7fa8670cef7049564d92c77b6..447a8ffa3a111dcc6ddec8b6081097f4127d2e59 100755 (executable)
@@ -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
index cb82eb7e66b4feb24086407019a812f46b715a34..128ba935371fe7a35b4fb8b80ba361a086be01f7 100755 (executable)
@@ -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
 '