]> git.ipfire.org Git - thirdparty/git.git/commitdiff
diff: add config option relative
authorLaurent Arnoud <laurent@spkdev.net>
Fri, 22 May 2020 10:46:18 +0000 (12:46 +0200)
committerJunio C Hamano <gitster@pobox.com>
Sun, 24 May 2020 23:23:59 +0000 (16:23 -0700)
The `diff.relative` boolean option set to `true` shows only changes in
the current directory/value specified by the `path` argument of the
`relative` option and shows pathnames relative to the aforementioned
directory.

Teach `--no-relative` to override earlier `--relative`

Add for git-format-patch(1) options documentation `--relative` and
`--no-relative`

Signed-off-by: Laurent Arnoud <laurent@spkdev.net>
Acked-by: Đoàn Trần Công Danh <congdanhqx@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/config/diff.txt
Documentation/diff-options.txt
diff.c
t/t4014-format-patch.sh
t/t4045-diff-relative.sh

index ff09f1cf737c062898ac40555402de097d360eb9..c3ae136eba6de181ac07b14f52c69bbbec28bc95 100644 (file)
@@ -105,6 +105,10 @@ diff.mnemonicPrefix::
 diff.noprefix::
        If set, 'git diff' does not show any source or destination prefix.
 
+diff.relative::
+       If set to 'true', 'git diff' does not show changes outside of the directory
+       and show pathnames relative to the current directory.
+
 diff.orderFile::
        File indicating how to order files within a diff.
        See the '-O' option to linkgit:git-diff[1] for details.
index bb31f0c42b3f8a7b26f6eb01e7e1ad7c0b0fa008..7987d72b0212e1247ff5ea14b553d4a322c1f5f5 100644 (file)
@@ -643,15 +643,18 @@ ifndef::git-format-patch[]
 -R::
        Swap two inputs; that is, show differences from index or
        on-disk file to tree contents.
+endif::git-format-patch[]
 
 --relative[=<path>]::
+--no-relative::
        When run from a subdirectory of the project, it can be
        told to exclude changes outside the directory and show
        pathnames relative to it with this option.  When you are
        not in a subdirectory (e.g. in a bare repository), you
        can name which subdirectory to make the output relative
        to by giving a <path> as an argument.
-endif::git-format-patch[]
+       `--no-relative` can be used to countermand both `diff.relative` config
+       option and previous `--relative`.
 
 -a::
 --text::
diff --git a/diff.c b/diff.c
index d1ad6a3c4ad0bc5049d1af26ca0ea33fc9f68a1e..863da896c00fafe0076377220f6e87e015f8d9a3 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -48,6 +48,7 @@ static const char *diff_order_file_cfg;
 int diff_auto_refresh_index = 1;
 static int diff_mnemonic_prefix;
 static int diff_no_prefix;
+static int diff_relative;
 static int diff_stat_graph_width;
 static int diff_dirstat_permille_default = 30;
 static struct diff_options default_diff_options;
@@ -386,6 +387,10 @@ int git_diff_ui_config(const char *var, const char *value, void *cb)
                diff_no_prefix = git_config_bool(var, value);
                return 0;
        }
+       if (!strcmp(var, "diff.relative")) {
+               diff_relative = git_config_bool(var, value);
+               return 0;
+       }
        if (!strcmp(var, "diff.statgraphwidth")) {
                diff_stat_graph_width = git_config_int(var, value);
                return 0;
@@ -4538,6 +4543,7 @@ void repo_diff_setup(struct repository *r, struct diff_options *options)
        options->interhunkcontext = diff_interhunk_context_default;
        options->ws_error_highlight = ws_error_highlight_default;
        options->flags.rename_empty = 1;
+       options->flags.relative_name = diff_relative;
        options->objfind = NULL;
 
        /* pathchange left =NULL by default */
@@ -5195,8 +5201,7 @@ static int diff_opt_relative(const struct option *opt,
 {
        struct diff_options *options = opt->value;
 
-       BUG_ON_OPT_NEG(unset);
-       options->flags.relative_name = 1;
+       options->flags.relative_name = !unset;
        if (arg)
                options->prefix = arg;
        return 0;
@@ -5492,7 +5497,7 @@ static void prep_parse_options(struct diff_options *options)
                OPT_GROUP(N_("Other diff options")),
                OPT_CALLBACK_F(0, "relative", options, N_("<prefix>"),
                               N_("when run from subdir, exclude changes outside and show relative paths"),
-                              PARSE_OPT_NONEG | PARSE_OPT_OPTARG,
+                              PARSE_OPT_OPTARG,
                               diff_opt_relative),
                OPT_BOOL('a', "text", &options->flags.text,
                         N_("treat all files as text")),
index db7e733af9e5be1abe8991e1513f9d31949433f4..575e079cc261628ceca5013b8df3ddb74156f030 100755 (executable)
@@ -1602,6 +1602,19 @@ test_expect_success 'format patch ignores color.ui' '
        test_cmp expect actual
 '
 
+test_expect_success 'format patch respects diff.relative' '
+       rm -rf subdir &&
+       mkdir subdir &&
+       echo other content >subdir/file2 &&
+       git add subdir/file2 &&
+       git commit -F msg &&
+       test_unconfig diff.relative &&
+       git format-patch --relative=subdir --stdout -1 >expect &&
+       test_config diff.relative true &&
+       git -C subdir format-patch --stdout -1 >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success 'cover letter with invalid --cover-from-description and config' '
        test_config branch.rebuild-1.description "config subject
 
index 258808708e1093819a32e68dfc76b6faf506f388..7be1de736d86c90ac9c36ff68c0e8f4535e9bafd 100755 (executable)
@@ -8,7 +8,8 @@ test_expect_success 'setup' '
        echo content >file1 &&
        mkdir subdir &&
        echo other content >subdir/file2 &&
-       blob=$(git hash-object subdir/file2) &&
+       blob_file1=$(git hash-object file1) &&
+       blob_file2=$(git hash-object subdir/file2) &&
        git add . &&
        git commit -m one
 '
@@ -18,7 +19,7 @@ check_diff () {
        shift
        expect=$1
        shift
-       short_blob=$(git rev-parse --short $blob)
+       short_blob=$(git rev-parse --short $blob_file2)
        cat >expected <<-EOF
        diff --git a/$expect b/$expect
        new file mode 100644
@@ -70,7 +71,7 @@ check_raw () {
        expect=$1
        shift
        cat >expected <<-EOF
-       :000000 100644 $ZERO_OID $blob A        $expect
+       :000000 100644 $ZERO_OID $blob_file2 A  $expect
        EOF
        test_expect_success "--raw $*" "
                git -C '$dir' diff --no-abbrev --raw $* HEAD^ >actual &&
@@ -86,4 +87,79 @@ do
        check_$type . dir/file2 --relative=sub
 done
 
+check_diff_relative_option () {
+       dir=$1
+       shift
+       expect=$1
+       shift
+       relative_opt=$1
+       shift
+       test_expect_success "config diff.relative $relative_opt -p $*" "
+               short_blob=\$(git rev-parse --short $blob_file2) &&
+               cat >expected <<-EOF &&
+               diff --git a/$expect b/$expect
+               new file mode 100644
+               index 0000000..\$short_blob
+               --- /dev/null
+               +++ b/$expect
+               @@ -0,0 +1 @@
+               +other content
+               EOF
+               test_config -C $dir diff.relative $relative_opt &&
+               git -C '$dir' diff -p $* HEAD^ >actual &&
+               test_cmp expected actual
+       "
+}
+
+check_diff_no_relative_option () {
+       dir=$1
+       shift
+       expect=$1
+       shift
+       relative_opt=$1
+       shift
+       test_expect_success "config diff.relative $relative_opt -p $*" "
+               short_blob_file1=\$(git rev-parse --short $blob_file1) &&
+               short_blob_file2=\$(git rev-parse --short $blob_file2) &&
+               cat >expected <<-EOF &&
+               diff --git a/file1 b/file1
+               new file mode 100644
+               index 0000000..\$short_blob_file1
+               --- /dev/null
+               +++ b/file1
+               @@ -0,0 +1 @@
+               +content
+               diff --git a/$expect b/$expect
+               new file mode 100644
+               index 0000000..\$short_blob_file2
+               --- /dev/null
+               +++ b/$expect
+               @@ -0,0 +1 @@
+               +other content
+               EOF
+               test_config -C $dir diff.relative $relative_opt &&
+               git -C '$dir' diff -p $* HEAD^ >actual &&
+               test_cmp expected actual
+       "
+}
+
+check_diff_no_relative_option . subdir/file2 false
+check_diff_no_relative_option . subdir/file2 true --no-relative
+check_diff_no_relative_option . subdir/file2 false --no-relative
+check_diff_no_relative_option subdir subdir/file2 false
+check_diff_no_relative_option subdir subdir/file2 true --no-relative
+check_diff_no_relative_option subdir subdir/file2 false --no-relative
+
+check_diff_relative_option . file2 false --relative=subdir/
+check_diff_relative_option . file2 false --relative=subdir
+check_diff_relative_option . file2 true --relative=subdir/
+check_diff_relative_option . file2 true --relative=subdir
+check_diff_relative_option subdir file2 false --relative
+check_diff_relative_option subdir file2 true --relative
+check_diff_relative_option subdir file2 true
+check_diff_relative_option subdir file2 false --no-relative --relative
+check_diff_relative_option subdir file2 true --no-relative --relative
+check_diff_relative_option . file2 false --no-relative --relative=subdir
+check_diff_relative_option . file2 true --no-relative --relative=subdir
+
 test_done