]> git.ipfire.org Git - thirdparty/git.git/blobdiff - builtin/add.c
The fifth batch
[thirdparty/git.git] / builtin / add.c
index 393c10cbcf6315efb525b38db26e218bf6b1959d..3dfcfc5fba3341076cbef3672fff2dd87f7a12c7 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (C) 2006 Linus Torvalds
  */
-#define USE_THE_INDEX_VARIABLE
+
 #include "builtin.h"
 #include "advice.h"
 #include "config.h"
@@ -40,20 +40,20 @@ static int chmod_pathspec(struct pathspec *pathspec, char flip, int show_only)
 {
        int i, ret = 0;
 
-       for (i = 0; i < the_index.cache_nr; i++) {
-               struct cache_entry *ce = the_index.cache[i];
+       for (i = 0; i < the_repository->index->cache_nr; i++) {
+               struct cache_entry *ce = the_repository->index->cache[i];
                int err;
 
                if (!include_sparse &&
                    (ce_skip_worktree(ce) ||
-                    !path_in_sparse_checkout(ce->name, &the_index)))
+                    !path_in_sparse_checkout(ce->name, the_repository->index)))
                        continue;
 
-               if (pathspec && !ce_path_match(&the_index, ce, pathspec, NULL))
+               if (pathspec && !ce_path_match(the_repository->index, ce, pathspec, NULL))
                        continue;
 
                if (!show_only)
-                       err = chmod_index_entry(&the_index, ce, flip);
+                       err = chmod_index_entry(the_repository->index, ce, flip);
                else
                        err = S_ISREG(ce->ce_mode) ? 0 : -1;
 
@@ -68,20 +68,20 @@ static int renormalize_tracked_files(const struct pathspec *pathspec, int flags)
 {
        int i, retval = 0;
 
-       for (i = 0; i < the_index.cache_nr; i++) {
-               struct cache_entry *ce = the_index.cache[i];
+       for (i = 0; i < the_repository->index->cache_nr; i++) {
+               struct cache_entry *ce = the_repository->index->cache[i];
 
                if (!include_sparse &&
                    (ce_skip_worktree(ce) ||
-                    !path_in_sparse_checkout(ce->name, &the_index)))
+                    !path_in_sparse_checkout(ce->name, the_repository->index)))
                        continue;
                if (ce_stage(ce))
                        continue; /* do not touch unmerged paths */
                if (!S_ISREG(ce->ce_mode) && !S_ISLNK(ce->ce_mode))
                        continue; /* do not touch non blobs */
-               if (pathspec && !ce_path_match(&the_index, ce, pathspec, NULL))
+               if (pathspec && !ce_path_match(the_repository->index, ce, pathspec, NULL))
                        continue;
-               retval |= add_file_to_index(&the_index, ce->name,
+               retval |= add_file_to_index(the_repository->index, ce->name,
                                            flags | ADD_CACHE_RENORMALIZE);
        }
 
@@ -100,11 +100,11 @@ static char *prune_directory(struct dir_struct *dir, struct pathspec *pathspec,
        i = dir->nr;
        while (--i >= 0) {
                struct dir_entry *entry = *src++;
-               if (dir_path_match(&the_index, entry, pathspec, prefix, seen))
+               if (dir_path_match(the_repository->index, entry, pathspec, prefix, seen))
                        *dst++ = entry;
        }
        dir->nr = dst - dir->entries;
-       add_pathspec_matches_against_index(pathspec, &the_index, seen,
+       add_pathspec_matches_against_index(pathspec, the_repository->index, seen,
                                           PS_IGNORE_SKIP_WORKTREE);
        return seen;
 }
@@ -119,14 +119,14 @@ static int refresh(int verbose, const struct pathspec *pathspec)
                    (verbose ? REFRESH_IN_PORCELAIN : REFRESH_QUIET);
 
        seen = xcalloc(pathspec->nr, 1);
-       refresh_index(&the_index, flags, pathspec, seen,
+       refresh_index(the_repository->index, flags, pathspec, seen,
                      _("Unstaged changes after refreshing the index:"));
        for (i = 0; i < pathspec->nr; i++) {
                if (!seen[i]) {
                        const char *path = pathspec->items[i].original;
 
                        if (matches_skip_worktree(pathspec, i, &skip_worktree_seen) ||
-                           !path_in_sparse_checkout(path, &the_index)) {
+                           !path_in_sparse_checkout(path, the_repository->index)) {
                                string_list_append(&only_match_skip_worktree,
                                                   pathspec->items[i].original);
                        } else {
@@ -150,7 +150,7 @@ static int refresh(int verbose, const struct pathspec *pathspec)
 int interactive_add(const char **argv, const char *prefix, int patch)
 {
        struct pathspec pathspec;
-       int unused;
+       int unused, ret;
 
        if (!git_config_get_bool("add.interactive.usebuiltin", &unused))
                warning(_("the add.interactive.useBuiltin setting has been removed!\n"
@@ -163,9 +163,12 @@ int interactive_add(const char **argv, const char *prefix, int patch)
                       prefix, argv);
 
        if (patch)
-               return !!run_add_p(the_repository, ADD_P_ADD, NULL, &pathspec);
+               ret = !!run_add_p(the_repository, ADD_P_ADD, NULL, &pathspec);
        else
-               return !!run_add_i(the_repository, &pathspec);
+               ret = !!run_add_i(the_repository, &pathspec);
+
+       clear_pathspec(&pathspec);
+       return ret;
 }
 
 static int edit_patch(int argc, const char **argv, const char *prefix)
@@ -310,9 +313,9 @@ static void check_embedded_repo(const char *path)
        strbuf_strip_suffix(&name, "/");
 
        warning(_("adding embedded git repository: %s"), name.buf);
-       if (!adviced_on_embedded_repo &&
-           advice_enabled(ADVICE_ADD_EMBEDDED_REPO)) {
-               advise(embedded_advice, name.buf, name.buf);
+       if (!adviced_on_embedded_repo) {
+               advise_if_enabled(ADVICE_ADD_EMBEDDED_REPO,
+                                 embedded_advice, name.buf, name.buf);
                adviced_on_embedded_repo = 1;
        }
 
@@ -328,21 +331,19 @@ static int add_files(struct dir_struct *dir, int flags)
                fprintf(stderr, _(ignore_error));
                for (i = 0; i < dir->ignored_nr; i++)
                        fprintf(stderr, "%s\n", dir->ignored[i]->name);
-               if (advice_enabled(ADVICE_ADD_IGNORED_FILE))
-                       advise(_("Use -f if you really want to add them.\n"
-                               "Turn this message off by running\n"
-                               "\"git config advice.addIgnoredFile false\""));
+               advise_if_enabled(ADVICE_ADD_IGNORED_FILE,
+                                 _("Use -f if you really want to add them."));
                exit_status = 1;
        }
 
        for (i = 0; i < dir->nr; i++) {
                if (!include_sparse &&
-                   !path_in_sparse_checkout(dir->entries[i]->name, &the_index)) {
+                   !path_in_sparse_checkout(dir->entries[i]->name, the_repository->index)) {
                        string_list_append(&matched_sparse_paths,
                                           dir->entries[i]->name);
                        continue;
                }
-               if (add_file_to_index(&the_index, dir->entries[i]->name, flags)) {
+               if (add_file_to_index(the_repository->index, dir->entries[i]->name, flags)) {
                        if (!ignore_add_errors)
                                die(_("adding files failed"));
                        exit_status = 1;
@@ -370,6 +371,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)
        int add_new_files;
        int require_pathspec;
        char *seen = NULL;
+       char *ps_matched = NULL;
        struct lock_file lock_file = LOCK_INIT;
 
        git_config(add_config, NULL);
@@ -440,10 +442,8 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 
        if (require_pathspec && pathspec.nr == 0) {
                fprintf(stderr, _("Nothing specified, nothing added.\n"));
-               if (advice_enabled(ADVICE_ADD_EMPTY_PATHSPEC))
-                       advise( _("Maybe you wanted to say 'git add .'?\n"
-                               "Turn this message off by running\n"
-                               "\"git config advice.addEmptyPathspec false\""));
+               advise_if_enabled(ADVICE_ADD_EMPTY_PATHSPEC,
+                                 _("Maybe you wanted to say 'git add .'?"));
                return 0;
        }
 
@@ -461,8 +461,8 @@ int cmd_add(int argc, const char **argv, const char *prefix)
        if (repo_read_index_preload(the_repository, &pathspec, 0) < 0)
                die(_("index file corrupt"));
 
-       die_in_unpopulated_submodule(&the_index, prefix);
-       die_path_inside_submodule(&the_index, &pathspec);
+       die_in_unpopulated_submodule(the_repository->index, prefix);
+       die_path_inside_submodule(the_repository->index, &pathspec);
 
        if (add_new_files) {
                int baselen;
@@ -474,7 +474,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)
                }
 
                /* This picks up the paths that are not tracked */
-               baselen = fill_directory(&dir, &the_index, &pathspec);
+               baselen = fill_directory(&dir, the_repository->index, &pathspec);
                if (pathspec.nr)
                        seen = prune_directory(&dir, &pathspec, baselen);
        }
@@ -491,7 +491,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 
                if (!seen)
                        seen = find_pathspecs_matching_against_index(&pathspec,
-                                       &the_index, PS_IGNORE_SKIP_WORKTREE);
+                                       the_repository->index, PS_IGNORE_SKIP_WORKTREE);
 
                /*
                 * file_exists() assumes exact match
@@ -527,8 +527,8 @@ int cmd_add(int argc, const char **argv, const char *prefix)
                            !file_exists(path)) {
                                if (ignore_missing) {
                                        int dtype = DT_UNKNOWN;
-                                       if (is_excluded(&dir, &the_index, path, &dtype))
-                                               dir_add_ignored(&dir, &the_index,
+                                       if (is_excluded(&dir, the_repository->index, path, &dtype))
+                                               dir_add_ignored(&dir, the_repository->index,
                                                                path, pathspec.items[i].len);
                                } else
                                        die(_("pathspec '%s' did not match any files"),
@@ -549,12 +549,17 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 
        begin_odb_transaction();
 
+       ps_matched = xcalloc(pathspec.nr, 1);
        if (add_renormalize)
                exit_status |= renormalize_tracked_files(&pathspec, flags);
        else
                exit_status |= add_files_to_cache(the_repository, prefix,
-                                                 &pathspec, include_sparse,
-                                                 flags);
+                                                 &pathspec, ps_matched,
+                                                 include_sparse, flags);
+
+       if (take_worktree_changes && !add_renormalize && !ignore_add_errors &&
+           report_path_error(ps_matched, &pathspec))
+               exit(128);
 
        if (add_new_files)
                exit_status |= add_files(&dir, flags);
@@ -564,10 +569,11 @@ int cmd_add(int argc, const char **argv, const char *prefix)
        end_odb_transaction();
 
 finish:
-       if (write_locked_index(&the_index, &lock_file,
+       if (write_locked_index(the_repository->index, &lock_file,
                               COMMIT_LOCK | SKIP_IF_UNCHANGED))
                die(_("unable to write new index file"));
 
+       free(ps_matched);
        dir_clear(&dir);
        clear_pathspec(&pathspec);
        return exit_status;