When the user wants to bypass the ignored status configured by submodule.<name>.ignore=all it is now allowed by using the -f option. Signed-off-by: Heiko Voigt <hvoigt@xxxxxxxxxx> --- builtin/add.c | 49 +++++++++++++++++++++++++++++++++++++------------ submodule.c | 10 ++++++++++ submodule.h | 1 + 3 files changed, 48 insertions(+), 12 deletions(-) diff --git a/builtin/add.c b/builtin/add.c index 2d0d2ef..d6cab7f 100644 --- a/builtin/add.c +++ b/builtin/add.c @@ -16,6 +16,7 @@ #include "revision.h" #include "bulk-checkin.h" #include "submodule.h" +#include "string-list.h" static const char * const builtin_add_usage[] = { N_("git add [options] [--] <pathspec>..."), @@ -37,6 +38,20 @@ struct update_callback_data { static const char *option_with_implicit_dot; static const char *short_option_with_implicit_dot; +static struct lock_file lock_file; + +static const char ignore_error[] = +N_("The following paths are ignored by one of your .gitignore files:\n"); +static const char submodule_ignore_error[] = +N_("The following paths are ignored submodules:\n"); + +static int verbose, show_only, ignored_too, refresh_only; +static int ignore_add_errors, intent_to_add, ignore_missing; + +#define ADDREMOVE_DEFAULT 0 /* Change to 1 in Git 2.0 */ +static int addremove = ADDREMOVE_DEFAULT; +static int addremove_explicit = -1; /* unspecified */ + static void warn_pathless_add(void) { static int shown; @@ -140,6 +155,9 @@ static void update_callback(struct diff_queue_struct *q, warn_pathless_add(); continue; } + if (is_ignored_submodule(path) && !ignored_too) + continue; + switch (fix_unmerged_status(p, data)) { default: die(_("unexpected diff status %c"), p->status); @@ -174,6 +192,7 @@ static void update_files_in_cache(const char *prefix, struct rev_info rev; init_revisions(&rev, prefix); + enforce_no_complete_ignore_submodule(&rev.diffopt); setup_revisions(0, NULL, &rev, NULL); if (pathspec) copy_pathspec(&rev.prune_data, pathspec); @@ -332,18 +351,6 @@ static int edit_patch(int argc, const char **argv, const char *prefix) return 0; } -static struct lock_file lock_file; - -static const char ignore_error[] = -N_("The following paths are ignored by one of your .gitignore files:\n"); - -static int verbose, show_only, ignored_too, refresh_only; -static int ignore_add_errors, intent_to_add, ignore_missing; - -#define ADDREMOVE_DEFAULT 0 /* Change to 1 in Git 2.0 */ -static int addremove = ADDREMOVE_DEFAULT; -static int addremove_explicit = -1; /* unspecified */ - static int ignore_removal_cb(const struct option *opt, const char *arg, int unset) { /* if we are told to ignore, we are not adding removals */ @@ -407,6 +414,17 @@ static int add_files(struct dir_struct *dir, int flags) return exit_status; } +static void die_ignored_submodules(struct string_list *ignored_submodules) +{ + struct string_list_item *path; + + fprintf(stderr, _(submodule_ignore_error)); + for_each_string_list_item(path, ignored_submodules) + fprintf(stderr, "%s\n", path->string); + fprintf(stderr, _("Use -f if you really want to add them.\n")); + die(_("no files added")); +} + int cmd_add(int argc, const char **argv, const char *prefix) { int exit_status = 0; @@ -419,6 +437,7 @@ int cmd_add(int argc, const char **argv, const char *prefix) char *seen = NULL; int implicit_dot = 0; struct update_callback_data update_data; + struct string_list ignored_submodules = STRING_LIST_INIT_NODUP; gitmodules_config(); git_config(add_config, NULL); @@ -550,6 +569,7 @@ int cmd_add(int argc, const char **argv, const char *prefix) for (i = 0; i < pathspec.nr; i++) { const char *path = pathspec.items[i].match; + char path_copy[PATH_MAX]; if (!seen[i] && ((pathspec.items[i].magic & (PATHSPEC_GLOB | PATHSPEC_ICASE)) || @@ -562,6 +582,9 @@ int cmd_add(int argc, const char **argv, const char *prefix) die(_("pathspec '%s' did not match any files"), pathspec.items[i].original); } + normalize_path_copy(path_copy, path); + if (is_ignored_submodule(path_copy)) + string_list_insert(&ignored_submodules, path); } free(seen); } @@ -583,6 +606,8 @@ int cmd_add(int argc, const char **argv, const char *prefix) update_files_in_cache(prefix, &pathspec, &update_data); exit_status |= !!update_data.add_errors; + if (!ignored_too && ignored_submodules.nr) + die_ignored_submodules(&ignored_submodules); if (add_new_files) exit_status |= add_files(&dir, flags); diff --git a/submodule.c b/submodule.c index e0719b6..c28a926 100644 --- a/submodule.c +++ b/submodule.c @@ -199,6 +199,16 @@ void set_diffopt_flags_from_submodule_config(struct diff_options *diffopt, } } +int is_ignored_submodule(const char *path) +{ + struct diff_options diffopt; + memset(&diffopt, 0, sizeof(diffopt)); + set_diffopt_flags_from_submodule_config(&diffopt, path); + if (DIFF_OPT_TST(&diffopt, IGNORE_SUBMODULES)) + return 1; + return 0; +} + int submodule_config(const char *var, const char *value, void *cb) { if (!prefixcmp(var, "submodule.")) diff --git a/submodule.h b/submodule.h index 2c8087e..e067580 100644 --- a/submodule.h +++ b/submodule.h @@ -17,6 +17,7 @@ int remove_path_from_gitmodules(const char *path); void stage_updated_gitmodules(void); void set_diffopt_flags_from_submodule_config(struct diff_options *diffopt, const char *path); +int is_ignored_submodule(const char *path); int submodule_config(const char *var, const char *value, void *cb); void gitmodules_config(void); int parse_submodule_config_option(const char *var, const char *value); -- 1.8.5.1.43.gf00fb86 -- 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