Heiko Voigt <hvoigt@xxxxxxxxxx> writes: > 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); Why is this done so late in the process? Shouldn't it be done immediately after we have finished iterating over the pathspecs, checking with is_ignored_submodule() and stuffing them into ignored_submodules string list, not waiting for plugging bulk checkin or updating paths already tracked in the index? > 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); -- 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