Remove redundant code, eliminate one static variable
[gitweb.git] / builtin-add.c
index 786280818aaad12afbd7ce45bf955db9a6a7edc5..73235ed08a9d60f8134235d9b68632303f359ca9 100644 (file)
@@ -191,6 +191,7 @@ static const char ignore_error[] =
 "The following paths are ignored by one of your .gitignore files:\n";
 
 static int verbose = 0, show_only = 0, ignored_too = 0, refresh_only = 0;
+static int ignore_add_errors;
 
 static struct option builtin_add_options[] = {
        OPT__DRY_RUN(&show_only),
@@ -201,9 +202,19 @@ static struct option builtin_add_options[] = {
        OPT_BOOLEAN('f', NULL, &ignored_too, "allow adding otherwise ignored files"),
        OPT_BOOLEAN('u', NULL, &take_worktree_changes, "update tracked files"),
        OPT_BOOLEAN( 0 , "refresh", &refresh_only, "don't add, only refresh the index"),
+       OPT_BOOLEAN( 0 , "ignore-errors", &ignore_add_errors, "just skip files which cannot be added because of errors"),
        OPT_END(),
 };
 
+static int add_config(const char *var, const char *value)
+{
+       if (!strcasecmp(var, "add.ignore-errors")) {
+               ignore_add_errors = git_config_bool(var, value);
+               return 0;
+       }
+       return git_default_config(var, value);
+}
+
 int cmd_add(int argc, const char **argv, const char *prefix)
 {
        int exit_status = 0;
@@ -218,7 +229,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)
        if (add_interactive)
                exit(interactive_add(argc, argv, prefix));
 
-       git_config(git_default_config);
+       git_config(add_config);
 
        newfd = hold_locked_index(&lock_file, 1);
 
@@ -231,6 +242,8 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 
                if (verbose)
                        flags |= ADD_FILES_VERBOSE;
+               if (ignore_add_errors)
+                       flags |= ADD_FILES_IGNORE_ERRORS;
 
                exit_status = add_files_to_cache(prefix, pathspec, flags);
                goto finish;
@@ -274,8 +287,11 @@ int cmd_add(int argc, const char **argv, const char *prefix)
        }
 
        for (i = 0; i < dir.nr; i++)
-               if (add_file_to_cache(dir.entries[i]->name, verbose))
-                       die("adding files failed");
+               if (add_file_to_cache(dir.entries[i]->name, verbose)) {
+                       if (!ignore_add_errors)
+                               die("adding files failed");
+                       exit_status = 1;
+               }
 
  finish:
        if (active_cache_changed) {