From: Anders Waldenborg <anders@xxxxxxx> diff.orderfile acts as a default for the -O command line option. [sb: fixed testcases & revised docs based on Jonathan Nieder's suggestions] Signed-off-by: Anders Waldenborg <anders@xxxxxxx> Thanks-to: Jonathan Nieder <jrnieder@xxxxxxxxx> Signed-off-by: Samuel Bronson <naesten@xxxxxxxxx> --- *I* even verified that the tests do fail properly when the feature is sabotaged. Documentation/diff-config.txt | 5 +++ Documentation/diff-options.txt | 2 ++ diff.c | 5 +++ t/t4056-diff-order.sh | 79 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 91 insertions(+) create mode 100755 t/t4056-diff-order.sh diff --git a/Documentation/diff-config.txt b/Documentation/diff-config.txt index 223b931..f07b451 100644 --- a/Documentation/diff-config.txt +++ b/Documentation/diff-config.txt @@ -98,6 +98,11 @@ diff.mnemonicprefix:: diff.noprefix:: If set, 'git diff' does not show any source or destination prefix. +diff.orderfile:: + File indicating how to order files within a diff, using + one shell glob pattern per line. + Can be overridden by the '-O' option to linkgit:git-diff[1]. + diff.renameLimit:: The number of files to consider when performing the copy/rename detection; equivalent to the 'git diff' option '-l'. diff --git a/Documentation/diff-options.txt b/Documentation/diff-options.txt index bbed2cd..1af5a5e 100644 --- a/Documentation/diff-options.txt +++ b/Documentation/diff-options.txt @@ -432,6 +432,8 @@ endif::git-format-patch[] -O<orderfile>:: Output the patch in the order specified in the <orderfile>, which has one shell glob pattern per line. + This overrides the `diff.orderfile' configuration variable + ((see linkgit:git-config[1]). ifndef::git-format-patch[] -R:: diff --git a/diff.c b/diff.c index e34bf97..a92b570 100644 --- a/diff.c +++ b/diff.c @@ -30,6 +30,7 @@ static int diff_use_color_default = -1; static int diff_context_default = 3; static const char *diff_word_regex_cfg; static const char *external_diff_cmd_cfg; +static const char *diff_order_file_cfg; int diff_auto_refresh_index = 1; static int diff_mnemonic_prefix; static int diff_no_prefix; @@ -201,6 +202,8 @@ int git_diff_ui_config(const char *var, const char *value, void *cb) return git_config_string(&external_diff_cmd_cfg, var, value); if (!strcmp(var, "diff.wordregex")) return git_config_string(&diff_word_regex_cfg, var, value); + if (!strcmp(var, "diff.orderfile")) + return git_config_string(&diff_order_file_cfg, var, value); if (!strcmp(var, "diff.ignoresubmodules")) handle_ignore_submodules_arg(&default_diff_options, value); @@ -3207,6 +3210,8 @@ void diff_setup(struct diff_options *options) options->detect_rename = diff_detect_rename_default; options->xdl_opts |= diff_algorithm; + options->orderfile = diff_order_file_cfg; + if (diff_no_prefix) { options->a_prefix = options->b_prefix = ""; } else if (!diff_mnemonic_prefix) { diff --git a/t/t4056-diff-order.sh b/t/t4056-diff-order.sh new file mode 100755 index 0000000..a756b34 --- /dev/null +++ b/t/t4056-diff-order.sh @@ -0,0 +1,79 @@ +#!/bin/sh + +test_description='diff order' + +. ./test-lib.sh + +create_files () { + echo "$1" >a.h && + echo "$1" >b.c && + echo "$1" >c/Makefile && + echo "$1" >d.txt && + git add a.h b.c c/Makefile d.txt && + git commit -m"$1" + return $? +} + +test_expect_success "setup" ' + mkdir c && + create_files 1 && + create_files 2 +' + +cat >order_file_1 <<EOF +*Makefile +*.txt +*.h +* +EOF +cat >order_file_2 <<EOF +*Makefile +*.h +*.c +* +EOF + +cat >expect_diff_headers_none <<EOF +diff --git a/a.h b/a.h +diff --git a/b.c b/b.c +diff --git a/c/Makefile b/c/Makefile +diff --git a/d.txt b/d.txt +EOF + +cat >expect_diff_headers_1 <<EOF +diff --git a/c/Makefile b/c/Makefile +diff --git a/d.txt b/d.txt +diff --git a/a.h b/a.h +diff --git a/b.c b/b.c +EOF + +cat >expect_diff_headers_2 <<EOF +diff --git a/c/Makefile b/c/Makefile +diff --git a/a.h b/a.h +diff --git a/b.c b/b.c +diff --git a/d.txt b/d.txt +EOF + +test_expect_success "no order (=tree object order)" ' + git diff HEAD^..HEAD >patch && + grep ^diff patch >actual_diff_headers && + test_cmp expect_diff_headers_none actual_diff_headers +' + +for i in 1 2; do + test_expect_success "orderfile using option ($i)" " + git diff -Oorder_file_$i HEAD^..HEAD >patch && + grep ^diff patch >actual_diff_headers && + test_cmp expect_diff_headers_$i actual_diff_headers +" +done + +for i in 1 2; do + test_expect_success "orderfile using config ($i)" " + git -c diff.orderfile=order_file_$i diff HEAD^..HEAD >patch && + grep ^diff patch >actual_diff_headers && + test_cmp expect_diff_headers_$i actual_diff_headers +" +done + +test_done -- 1.8.4.3 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html