From 42cb3c4db38f8b5a86bc2e4851b9c18d8d7681d2 Mon Sep 17 00:00:00 2001 From: Jens Lehmann Date: Tue, 10 Aug 2010 00:22:27 +0200 Subject: [PATCH] Configure ignore option for submodule name instead of path Signed-off-by: Jens Lehmann Signed-off-by: Johannes Schindelin --- Documentation/config.txt | 2 +- submodule.c | 45 ++++++++++------ t/t4027-diff-submodule.sh | 67 ++++++++++++++---------- t/t7508-status.sh | 105 +++++++++++++++++++++++--------------- 4 files changed, 133 insertions(+), 86 deletions(-) diff --git a/Documentation/config.txt b/Documentation/config.txt index 8384d124c0..470fd9323a 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -1763,7 +1763,7 @@ submodule..update:: URL and other values found in the `.gitmodules` file. See linkgit:git-submodule[1] and linkgit:gitmodules[5] for details. -submodule..ignore:: +submodule..ignore:: Defines under what circumstances "git status" and the diff family show a submodule as modified. When set to "all", it will never be considered modified, "dirty" will ignore all changes to the submodules work tree and diff --git a/submodule.c b/submodule.c index 75f3368897..beb8622317 100644 --- a/submodule.c +++ b/submodule.c @@ -8,7 +8,8 @@ #include "diffcore.h" #include "string-list.h" -struct string_list config_ignore; +struct string_list config_name_for_path; +struct string_list config_ignore_for_name; static int add_submodule_odb(const char *path) { @@ -52,10 +53,13 @@ done: void set_diffopt_flags_from_submodule_config(struct diff_options *diffopt, const char *path) { - struct string_list_item *ignore_option; - ignore_option = unsorted_string_list_lookup(&config_ignore, path); - if (ignore_option) - handle_ignore_submodules_arg(diffopt, ignore_option->util); + struct string_list_item *path_option, *ignore_option; + path_option = unsorted_string_list_lookup(&config_name_for_path, path); + if (path_option) { + ignore_option = unsorted_string_list_lookup(&config_ignore_for_name, path_option->util); + if (ignore_option) + handle_ignore_submodules_arg(diffopt, ignore_option->util); + } } static int submodule_config(const char *var, const char *value, void *cb) @@ -80,28 +84,37 @@ void gitmodules_config() int parse_submodule_config_option(const char *var, const char *value) { int len; - struct string_list_item *ignore_option; - struct strbuf path = STRBUF_INIT; + struct string_list_item *config; + struct strbuf submodname = STRBUF_INIT; var += 10; /* Skip "submodule." */ len = strlen(var); - if ((len > 7) && !strcmp(var + len - 7, ".ignore")) { + if ((len > 5) && !strcmp(var + len - 5, ".path")) { + strbuf_add(&submodname, var, len - 5); + config = unsorted_string_list_lookup(&config_name_for_path, value); + if (config) + free(config->util); + else + config = string_list_append(&config_name_for_path, xstrdup(value)); + config->util = strbuf_detach(&submodname, NULL); + strbuf_release(&submodname); + } else if ((len > 7) && !strcmp(var + len - 7, ".ignore")) { if (strcmp(value, "untracked") && strcmp(value, "dirty") && strcmp(value, "all") && strcmp(value, "none")) { warning("Invalid parameter \"%s\" for config option \"submodule.%s.ignore\"", value, var); return 0; } - strbuf_add(&path, var, len - 7); - ignore_option = unsorted_string_list_lookup(&config_ignore, path.buf); - if (ignore_option) - free(ignore_option->util); + strbuf_add(&submodname, var, len - 7); + config = unsorted_string_list_lookup(&config_ignore_for_name, submodname.buf); + if (config) + free(config->util); else - ignore_option = string_list_append(&config_ignore, - strbuf_detach(&path, NULL)); - strbuf_release(&path); - ignore_option->util = xstrdup(value); + config = string_list_append(&config_ignore_for_name, + strbuf_detach(&submodname, NULL)); + strbuf_release(&submodname); + config->util = xstrdup(value); return 0; } return 0; diff --git a/t/t4027-diff-submodule.sh b/t/t4027-diff-submodule.sh index dccdd2348e..1bc6e77a0d 100755 --- a/t/t4027-diff-submodule.sh +++ b/t/t4027-diff-submodule.sh @@ -115,52 +115,57 @@ test_expect_success 'git diff HEAD with dirty submodule (work tree, refs match)' ' test_expect_success 'git diff HEAD with dirty submodule (work tree, refs match) [.git/config]' ' - git config submodule.sub.ignore none && + git config submodule.subname.ignore none && + git config submodule.subname.path sub && git diff HEAD >actual && sed -e "1,/^@@/d" actual >actual.body && expect_from_to >expect.body $subprev $subprev-dirty && test_cmp expect.body actual.body && - git config submodule.sub.ignore all && + git config submodule.subname.ignore all && git diff HEAD >actual2 && ! test -s actual2 && - git config submodule.sub.ignore untracked && + git config submodule.subname.ignore untracked && git diff HEAD >actual3 && sed -e "1,/^@@/d" actual3 >actual3.body && expect_from_to >expect.body $subprev $subprev-dirty && test_cmp expect.body actual3.body && - git config submodule.sub.ignore dirty && + git config submodule.subname.ignore dirty && git diff HEAD >actual4 && ! test -s actual4 && git diff HEAD --ignore-submodules=none >actual && sed -e "1,/^@@/d" actual >actual.body && expect_from_to >expect.body $subprev $subprev-dirty && test_cmp expect.body actual.body && - git config --remove-section submodule.sub + git config --remove-section submodule.subname ' test_expect_success 'git diff HEAD with dirty submodule (work tree, refs match) [.gitmodules]' ' - git config --add -f .gitmodules submodule.sub.ignore none && + git config --add -f .gitmodules submodule.subname.ignore none && + git config --add -f .gitmodules submodule.subname.path sub && git diff HEAD >actual && sed -e "1,/^@@/d" actual >actual.body && expect_from_to >expect.body $subprev $subprev-dirty && test_cmp expect.body actual.body && - git config -f .gitmodules submodule.sub.ignore all && + git config -f .gitmodules submodule.subname.ignore all && + git config -f .gitmodules submodule.subname.path sub && git diff HEAD >actual2 && ! test -s actual2 && - git config -f .gitmodules submodule.sub.ignore untracked && + git config -f .gitmodules submodule.subname.ignore untracked && git diff HEAD >actual3 && sed -e "1,/^@@/d" actual3 >actual3.body && expect_from_to >expect.body $subprev $subprev-dirty && test_cmp expect.body actual3.body && - git config -f .gitmodules submodule.sub.ignore dirty && + git config -f .gitmodules submodule.subname.ignore dirty && git diff HEAD >actual4 && ! test -s actual4 && - git config submodule.sub.ignore none && + git config submodule.subname.ignore none && + git config submodule.subname.path sub && git diff HEAD >actual && sed -e "1,/^@@/d" actual >actual.body && expect_from_to >expect.body $subprev $subprev-dirty && test_cmp expect.body actual.body && - git config --remove-section submodule.sub && + git config --remove-section submodule.subname && + git config --remove-section -f .gitmodules submodule.subname && rm .gitmodules ' @@ -197,38 +202,42 @@ test_expect_success 'git diff HEAD with dirty submodule (untracked, refs match)' ' test_expect_success 'git diff HEAD with dirty submodule (untracked, refs match) [.git/config]' ' - git config submodule.sub.ignore all && + git config submodule.subname.ignore all && + git config submodule.subname.path sub && git diff HEAD >actual2 && ! test -s actual2 && - git config submodule.sub.ignore untracked && + git config submodule.subname.ignore untracked && git diff HEAD >actual3 && ! test -s actual3 && - git config submodule.sub.ignore dirty && + git config submodule.subname.ignore dirty && git diff HEAD >actual4 && ! test -s actual4 && git diff --ignore-submodules=none HEAD >actual && sed -e "1,/^@@/d" actual >actual.body && expect_from_to >expect.body $subprev $subprev-dirty && test_cmp expect.body actual.body && - git config --remove-section submodule.sub + git config --remove-section submodule.subname ' test_expect_success 'git diff HEAD with dirty submodule (untracked, refs match) [.gitmodules]' ' - git config --add -f .gitmodules submodule.sub.ignore all && + git config --add -f .gitmodules submodule.subname.ignore all && + git config --add -f .gitmodules submodule.subname.path sub && git diff HEAD >actual2 && ! test -s actual2 && - git config -f .gitmodules submodule.sub.ignore untracked && + git config -f .gitmodules submodule.subname.ignore untracked && git diff HEAD >actual3 && ! test -s actual3 && - git config -f .gitmodules submodule.sub.ignore dirty && + git config -f .gitmodules submodule.subname.ignore dirty && git diff HEAD >actual4 && ! test -s actual4 && - git config submodule.sub.ignore none && + git config submodule.subname.ignore none && + git config submodule.subname.path sub && git diff HEAD >actual && sed -e "1,/^@@/d" actual >actual.body && expect_from_to >expect.body $subprev $subprev-dirty && test_cmp expect.body actual.body && - git config --remove-section submodule.sub && + git config --remove-section submodule.subname && + git config --remove-section -f .gitmodules submodule.subname && rm .gitmodules ' @@ -250,18 +259,19 @@ test_expect_success 'git diff between submodule commits [.git/config]' ' sed -e "1,/^@@/d" actual >actual.body && expect_from_to >expect.body $subtip $subprev && test_cmp expect.body actual.body && - git config submodule.sub.ignore dirty && + git config submodule.subname.ignore dirty && + git config submodule.subname.path sub && git diff HEAD^..HEAD >actual && sed -e "1,/^@@/d" actual >actual.body && expect_from_to >expect.body $subtip $subprev && test_cmp expect.body actual.body && - git config submodule.sub.ignore all && + git config submodule.subname.ignore all && git diff HEAD^..HEAD >actual && ! test -s actual && git diff --ignore-submodules=dirty HEAD^..HEAD >actual && sed -e "1,/^@@/d" actual >actual.body && expect_from_to >expect.body $subtip $subprev && - git config --remove-section submodule.sub + git config --remove-section submodule.subname ' test_expect_success 'git diff between submodule commits [.gitmodules]' ' @@ -269,19 +279,22 @@ test_expect_success 'git diff between submodule commits [.gitmodules]' ' sed -e "1,/^@@/d" actual >actual.body && expect_from_to >expect.body $subtip $subprev && test_cmp expect.body actual.body && - git config --add -f .gitmodules submodule.sub.ignore dirty && + git config --add -f .gitmodules submodule.subname.ignore dirty && + git config --add -f .gitmodules submodule.subname.path sub && git diff HEAD^..HEAD >actual && sed -e "1,/^@@/d" actual >actual.body && expect_from_to >expect.body $subtip $subprev && test_cmp expect.body actual.body && - git config -f .gitmodules submodule.sub.ignore all && + git config -f .gitmodules submodule.subname.ignore all && git diff HEAD^..HEAD >actual && ! test -s actual && - git config submodule.sub.ignore dirty && + git config submodule.subname.ignore dirty && + git config submodule.subname.path sub && git diff HEAD^..HEAD >actual && sed -e "1,/^@@/d" actual >actual.body && expect_from_to >expect.body $subtip $subprev && - git config --remove-section submodule.sub && + git config --remove-section submodule.subname && + git config --remove-section -f .gitmodules submodule.subname && rm .gitmodules ' diff --git a/t/t7508-status.sh b/t/t7508-status.sh index 54f9e68654..1b92845be8 100755 --- a/t/t7508-status.sh +++ b/t/t7508-status.sh @@ -873,19 +873,22 @@ test_expect_success '--ignore-submodules=untracked suppresses submodules with un ' test_expect_success '.gitmodules ignore=untracked suppresses submodules with untracked content' ' - git config --add -f .gitmodules submodule.sm.ignore untracked && + git config --add -f .gitmodules submodule.subname.ignore untracked && + git config --add -f .gitmodules submodule.subname.path sm && git status > output && test_cmp expect output && - git config -f .gitmodules --remove-section submodule.sm + git config -f .gitmodules --remove-section submodule.subname ' test_expect_success '.git/config ignore=untracked suppresses submodules with untracked content' ' - git config --add -f .gitmodules submodule.sm.ignore none && - git config --add submodule.sm.ignore untracked && + git config --add -f .gitmodules submodule.subname.ignore none && + git config --add -f .gitmodules submodule.subname.path sm && + git config --add submodule.subname.ignore untracked && + git config --add submodule.subname.path sm && git status > output && test_cmp expect output && - git config -f .gitmodules --remove-section submodule.sm && - git config --remove-section submodule.sm + git config --remove-section submodule.subname && + git config --remove-section -f .gitmodules submodule.subname ' test_expect_success '--ignore-submodules=dirty suppresses submodules with untracked content' ' @@ -894,19 +897,22 @@ test_expect_success '--ignore-submodules=dirty suppresses submodules with untrac ' test_expect_success '.gitmodules ignore=dirty suppresses submodules with untracked content' ' - git config --add -f .gitmodules submodule.sm.ignore dirty && + git config --add -f .gitmodules submodule.subname.ignore dirty && + git config --add -f .gitmodules submodule.subname.path sm && git status > output && test_cmp expect output && - git config -f .gitmodules --remove-section submodule.sm + git config -f .gitmodules --remove-section submodule.subname ' test_expect_success '.git/config ignore=dirty suppresses submodules with untracked content' ' - git config --add -f .gitmodules submodule.sm.ignore none && - git config --add submodule.sm.ignore dirty && + git config --add -f .gitmodules submodule.subname.ignore none && + git config --add -f .gitmodules submodule.subname.path sm && + git config --add submodule.subname.ignore dirty && + git config --add submodule.subname.path sm && git status > output && test_cmp expect output && - git config -f .gitmodules --remove-section submodule.sm && - git config --remove-section submodule.sm + git config --remove-section submodule.subname && + git config -f .gitmodules --remove-section submodule.subname ' test_expect_success '--ignore-submodules=dirty suppresses submodules with modified content' ' @@ -916,19 +922,22 @@ test_expect_success '--ignore-submodules=dirty suppresses submodules with modifi ' test_expect_success '.gitmodules ignore=dirty suppresses submodules with modified content' ' - git config --add -f .gitmodules submodule.sm.ignore dirty && + git config --add -f .gitmodules submodule.subname.ignore dirty && + git config --add -f .gitmodules submodule.subname.path sm && git status > output && test_cmp expect output && - git config -f .gitmodules --remove-section submodule.sm + git config -f .gitmodules --remove-section submodule.subname ' test_expect_success '.git/config ignore=dirty suppresses submodules with modified content' ' - git config --add -f .gitmodules submodule.sm.ignore none && - git config --add submodule.sm.ignore dirty && + git config --add -f .gitmodules submodule.subname.ignore none && + git config --add -f .gitmodules submodule.subname.path sm && + git config --add submodule.subname.ignore dirty && + git config --add submodule.subname.path sm && git status > output && test_cmp expect output && - git config -f .gitmodules --remove-section submodule.sm && - git config --remove-section submodule.sm + git config --remove-section submodule.subname && + git config -f .gitmodules --remove-section submodule.subname ' cat > expect << EOF @@ -969,19 +978,22 @@ test_expect_success "--ignore-submodules=untracked doesn't suppress submodules w ' test_expect_success ".gitmodules ignore=untracked doesn't suppress submodules with modified content" ' - git config --add -f .gitmodules submodule.sm.ignore untracked && + git config --add -f .gitmodules submodule.subname.ignore untracked && + git config --add -f .gitmodules submodule.subname.path sm && git status > output && test_cmp expect output && - git config -f .gitmodules --remove-section submodule.sm + git config -f .gitmodules --remove-section submodule.subname ' test_expect_success ".git/config ignore=untracked doesn't suppress submodules with modified content" ' - git config --add -f .gitmodules submodule.sm.ignore none && - git config --add submodule.sm.ignore untracked && + git config --add -f .gitmodules submodule.subname.ignore none && + git config --add -f .gitmodules submodule.subname.path sm && + git config --add submodule.subname.ignore untracked && + git config --add submodule.subname.path sm && git status > output && test_cmp expect output && - git config -f .gitmodules --remove-section submodule.sm && - git config --remove-section submodule.sm + git config --remove-section submodule.subname && + git config -f .gitmodules --remove-section submodule.subname ' head2=$(cd sm && git commit -q -m "2nd commit" foo && git rev-parse --short=7 --verify HEAD) @@ -1028,19 +1040,22 @@ test_expect_success "--ignore-submodules=untracked doesn't suppress submodule su ' test_expect_success ".gitmodules ignore=untracked doesn't suppress submodule summary" ' - git config --add -f .gitmodules submodule.sm.ignore untracked && + git config --add -f .gitmodules submodule.subname.ignore untracked && + git config --add -f .gitmodules submodule.subname.path sm && git status > output && test_cmp expect output && - git config -f .gitmodules --remove-section submodule.sm + git config -f .gitmodules --remove-section submodule.subname ' test_expect_success ".git/config ignore=untracked doesn't suppress submodule summary" ' - git config --add -f .gitmodules submodule.sm.ignore none && - git config --add submodule.sm.ignore untracked && + git config --add -f .gitmodules submodule.subname.ignore none && + git config --add -f .gitmodules submodule.subname.path sm && + git config --add submodule.subname.ignore untracked && + git config --add submodule.subname.path sm && git status > output && test_cmp expect output && - git config -f .gitmodules --remove-section submodule.sm && - git config --remove-section submodule.sm + git config --remove-section submodule.subname && + git config -f .gitmodules --remove-section submodule.subname ' test_expect_success "--ignore-submodules=dirty doesn't suppress submodule summary" ' @@ -1048,19 +1063,22 @@ test_expect_success "--ignore-submodules=dirty doesn't suppress submodule summar test_cmp expect output ' test_expect_success ".gitmodules ignore=dirty doesn't suppress submodule summary" ' - git config --add -f .gitmodules submodule.sm.ignore dirty && + git config --add -f .gitmodules submodule.subname.ignore dirty && + git config --add -f .gitmodules submodule.subname.path sm && git status > output && test_cmp expect output && - git config -f .gitmodules --remove-section submodule.sm + git config -f .gitmodules --remove-section submodule.subname ' test_expect_success ".git/config ignore=dirty doesn't suppress submodule summary" ' - git config --add -f .gitmodules submodule.sm.ignore none && - git config --add submodule.sm.ignore dirty && + git config --add -f .gitmodules submodule.subname.ignore none && + git config --add -f .gitmodules submodule.subname.path sm && + git config --add submodule.subname.ignore dirty && + git config --add submodule.subname.path sm && git status > output && test_cmp expect output && - git config -f .gitmodules --remove-section submodule.sm && - git config --remove-section submodule.sm + git config --remove-section submodule.subname && + git config -f .gitmodules --remove-section submodule.subname ' cat > expect << EOF @@ -1090,19 +1108,22 @@ test_expect_success "--ignore-submodules=all suppresses submodule summary" ' ' test_expect_failure '.gitmodules ignore=all suppresses submodule summary' ' - git config --add -f .gitmodules submodule.sm.ignore all && + git config --add -f .gitmodules submodule.subname.ignore all && + git config --add -f .gitmodules submodule.subname.path sm && git status > output && test_cmp expect output && - git config -f .gitmodules --remove-section submodule.sm + git config -f .gitmodules --remove-section submodule.subname ' test_expect_failure '.git/config ignore=all suppresses submodule summary' ' - git config --add -f .gitmodules submodule.sm.ignore none && - git config --add submodule.sm.ignore all && + git config --add -f .gitmodules submodule.subname.ignore none && + git config --add -f .gitmodules submodule.subname.path sm && + git config --add submodule.subname.ignore all && + git config --add submodule.subname.path sm && git status > output && test_cmp expect output && - git config -f .gitmodules --remove-section submodule.sm && - git config --remove-section submodule.sm + git config --remove-section submodule.subname && + git config -f .gitmodules --remove-section submodule.subname ' test_done