summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeiko Voigt <hvoigt@hvoigt.net>2013-12-04 23:21:56 +0100
committerJunio C Hamano <gitster@pobox.com>2013-12-06 12:56:11 -0800
commit6425b54cd5ddccb813e1a58ea83b193e25eaffb0 (patch)
treebeb87afbd9d535e9967a0781d215c9c4317c5d35
parent66d237b834f13fdf9ba46da6cc3a3658ff34bd18 (diff)
downloadgit-6425b54cd5ddccb813e1a58ea83b193e25eaffb0.tar.gz
teach add -f option for ignored submodules
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@hvoigt.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--builtin/add.c49
-rw-r--r--submodule.c10
-rw-r--r--submodule.h1
3 files changed, 48 insertions, 12 deletions
diff --git a/builtin/add.c b/builtin/add.c
index 2d0d2efcbd..d6cab7ff7d 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 1905d75b2b..7d8b000ab4 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 7beec4822b..c20bb6f862 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);