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.ron...@gmail.com>
---
Patch changelog:
v6
* corrected wording and formatting errors (as pointed out by Eric Sunshine)
v5
* 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 | 80 +++++++++++++++++++++++++++++++++++++
 3 files changed, 94 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..55995be 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",
+       defaulting to "all".
+
 -v::
 --verbose::
        Show unified diff between the HEAD commit and what
diff --git a/builtin/commit.c b/builtin/commit.c
index 5444111..dc1d8d0 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) ||
@@ -1540,6 +1540,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,
@@ -1578,6 +1581,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..10ae178
--- /dev/null
+++ b/t/t7513-commit-ignore-submodules.sh
@@ -0,0 +1,80 @@
+#!/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
-- 
2.0.0.rc0.3.gd50de04

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to