Allow ignoring submodules (or not) by command line switch, like diff and status do. Git commit honors the 'ignore' setting from .gitmodules or .git/config, but didn't allow to override it from command line. This patch depends on Jens Lehmann's patch "commit -m: commit staged submodules regardless of ignore config". Without it, "commit -m --ignore-submodules" would not work and tests introduced here would fail. Signed-off-by: Ronald Weiss <weiss.ronald@xxxxxxxxx> --- Changes against v4 of this patch: * fixed file mode of added test script (644 -> 755) * replaced test_might_fail with test_must_fail in test script Documentation/git-commit.txt | 7 ++++ builtin/commit.c | 8 +++- t/t7513-commit-ignore-submodules.sh | 78 +++++++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+), 1 deletion(-) create mode 100755 t/t7513-commit-ignore-submodules.sh diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt index 0bbc8f5..de0e8fe 100644 --- a/Documentation/git-commit.txt +++ b/Documentation/git-commit.txt @@ -13,6 +13,7 @@ SYNOPSIS [-F <file> | -m <msg>] [--reset-author] [--allow-empty] [--allow-empty-message] [--no-verify] [-e] [--author=<author>] [--date=<date>] [--cleanup=<mode>] [--[no-]status] + [--ignore-submodules[=<when>]] [-i | -o] [-S[<key-id>]] [--] [<file>...] DESCRIPTION @@ -277,6 +278,12 @@ The possible options are: The default can be changed using the status.showUntrackedFiles configuration variable documented in linkgit:git-config[1]. +--ignore-submodules[=<when>]:: + Can be used to override any settings of the 'submodule.*.ignore' + option in linkgit:git-config[1] or linkgit:gitmodules[5]. + <when> can be either "none", "dirty, "untracked" or "all", which + is the default. + -v:: --verbose:: Show unified diff between the HEAD commit and what diff --git a/builtin/commit.c b/builtin/commit.c index a148e28..8c4d05e 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -361,7 +361,7 @@ static char *prepare_index(int argc, const char **argv, const char *prefix, */ if (all || (also && pathspec.nr)) { fd = hold_locked_index(&index_lock, 1); - add_files_to_cache(also ? prefix : NULL, &pathspec, 0, NULL); + add_files_to_cache(also ? prefix : NULL, &pathspec, 0, ignore_submodule_arg); refresh_cache_or_die(refresh_flags); update_main_cache_tree(WRITE_TREE_SILENT); if (write_cache(fd, active_cache, active_nr) || @@ -1526,6 +1526,9 @@ int cmd_commit(int argc, const char **argv, const char *prefix) OPT_BOOL(0, "amend", &amend, N_("amend previous commit")), OPT_BOOL(0, "no-post-rewrite", &no_post_rewrite, N_("bypass post-rewrite hook")), { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg, N_("mode"), N_("show untracked files, optional modes: all, normal, no. (Default: all)"), PARSE_OPT_OPTARG, NULL, (intptr_t)"all" }, + { OPTION_STRING, 0, "ignore-submodules", &ignore_submodule_arg, N_("when"), + N_("ignore changes to submodules, optional when: all, none. (Default: all)"), + PARSE_OPT_OPTARG, NULL, (intptr_t)"all" }, /* end commit contents options */ OPT_HIDDEN_BOOL(0, "allow-empty", &allow_empty, @@ -1564,6 +1567,9 @@ int cmd_commit(int argc, const char **argv, const char *prefix) argc = parse_and_validate_options(argc, argv, builtin_commit_options, builtin_commit_usage, prefix, current_head, &s); + + s.ignore_submodule_arg = ignore_submodule_arg; + if (dry_run) return dry_run_commit(argc, argv, prefix, current_head, &s); index_file = prepare_index(argc, argv, prefix, current_head, 0); diff --git a/t/t7513-commit-ignore-submodules.sh b/t/t7513-commit-ignore-submodules.sh new file mode 100755 index 0000000..52ab37d --- /dev/null +++ b/t/t7513-commit-ignore-submodules.sh @@ -0,0 +1,78 @@ +#!/bin/sh +# +# Copyright (c) 2014 Ronald Weiss +# + +test_description='Test of git commit --ignore-submodules' + +. ./test-lib.sh + +test_expect_success 'create submodule' ' + test_create_repo sm && ( + cd sm && + >foo && + git add foo && + git commit -m "Add foo" + ) && + git submodule add ./sm && + git commit -m "Add sm" +' + +update_sm () { + (cd sm && + echo bar >> foo && + git add foo && + git commit -m "Updated foo" + ) +} + +test_expect_success 'commit -a --ignore-submodules=all ignores dirty submodule' ' + update_sm && + test_must_fail git commit -a --ignore-submodules=all -m "Update sm" +' + +test_expect_success 'commit -a --ignore-submodules=none overrides ignore=all setting' ' + update_sm && + git config submodule.sm.ignore all && + git commit -a --ignore-submodules=none -m "Update sm" && + git diff --exit-code --ignore-submodules=none && + git diff --cached --exit-code --ignore-submodules=none +' + +test_expect_success 'commit --ignore-submodules status of submodule with untracked content' ' + GIT_EDITOR=cat && + export GIT_EDITOR && + echo untracked > sm/untracked && + + test_must_fail git commit --ignore-submodules=none > output && + test_i18ngrep modified output && + + test_must_fail git commit --ignore-submodules=untracked > output && + test_must_fail test_i18ngrep modified output && + + test_must_fail git commit --ignore-submodules=dirty > output && + test_must_fail test_i18ngrep modified output && + + test_must_fail git commit --ignore-submodules=all > output && + test_must_fail test_i18ngrep modified output +' + +test_expect_success 'commit --ignore-submodules status of dirty submodule' ' + GIT_EDITOR=cat && + export GIT_EDITOR && + echo dirty >> sm/foo && + + test_must_fail git commit --ignore-submodules=none > output && + test_i18ngrep modified output && + + test_must_fail git commit --ignore-submodules=untracked > output && + test_i18ngrep modified output && + + test_must_fail git commit --ignore-submodules=dirty > output && + test_must_fail test_i18ngrep modified output && + + test_must_fail git commit --ignore-submodules=all > output && + test_must_fail test_i18ngrep modified output +' + +test_done -- 1.9.1.3.g7790cde.dirty -- 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