]> git.ipfire.org Git - thirdparty/git.git/blame - builtin/add.c
repository: remove unnecessary include of path.h
[thirdparty/git.git] / builtin / add.c
CommitLineData
0d781539
LT
1/*
2 * "git add" builtin command
3 *
4 * Copyright (C) 2006 Linus Torvalds
5 */
07047d68 6#define USE_THE_INDEX_VARIABLE
bc5c5ec0 7#include "builtin.h"
6c6ddf92 8#include "advice.h"
b2141fc1 9#include "config.h"
697cc8ef 10#include "lockfile.h"
4e120823 11#include "editor.h"
0d781539 12#include "dir.h"
f394e093 13#include "gettext.h"
6f525e71 14#include "pathspec.h"
d807c4a0 15#include "exec-cmd.h"
93872e07 16#include "cache-tree.h"
58680165 17#include "run-command.h"
5c46f754 18#include "parse-options.h"
c339932b 19#include "path.h"
fbffdfb1 20#include "preload-index.h"
c59cb03a 21#include "diff.h"
fb7d3f32 22#include "diffcore.h"
08c46a49 23#include "read-cache.h"
c59cb03a 24#include "revision.h"
568508e7 25#include "bulk-checkin.h"
dbbcd44f 26#include "strvec.h"
bdab9721 27#include "submodule.h"
f83dff60 28#include "add-interactive.h"
0d781539 29
5c46f754 30static const char * const builtin_add_usage[] = {
9c9b4f2f 31 N_("git add [<options>] [--] <pathspec>..."),
5c46f754
KH
32 NULL
33};
c59cb03a 34static int patch_interactive, add_interactive, edit_interactive;
93c44d49 35static int take_worktree_changes;
9472935d 36static int add_renormalize;
bebb5d6d 37static int pathspec_file_nul;
0299a696 38static int include_sparse;
bebb5d6d 39static const char *pathspec_from_file;
896bdfa2 40
9ebd7fe1 41static int chmod_pathspec(struct pathspec *pathspec, char flip, int show_only)
610d55af 42{
9ebd7fe1 43 int i, ret = 0;
610d55af 44
dc594180
ÆAB
45 for (i = 0; i < the_index.cache_nr; i++) {
46 struct cache_entry *ce = the_index.cache[i];
c937d70b 47 int err;
610d55af 48
63b60b3a
DS
49 if (!include_sparse &&
50 (ce_skip_worktree(ce) ||
51 !path_in_sparse_checkout(ce->name, &the_index)))
d73dbafc
MT
52 continue;
53
6d2df284 54 if (pathspec && !ce_path_match(&the_index, ce, pathspec, NULL))
610d55af
TG
55 continue;
56
c937d70b 57 if (!show_only)
fbc1ed62 58 err = chmod_index_entry(&the_index, ce, flip);
c937d70b
MT
59 else
60 err = S_ISREG(ce->ce_mode) ? 0 : -1;
61
62 if (err < 0)
9ebd7fe1 63 ret = error(_("cannot chmod %cx '%s'"), flip, ce->name);
610d55af 64 }
9ebd7fe1
MT
65
66 return ret;
610d55af
TG
67}
68
9472935d
TB
69static int renormalize_tracked_files(const struct pathspec *pathspec, int flags)
70{
71 int i, retval = 0;
72
dc594180
ÆAB
73 for (i = 0; i < the_index.cache_nr; i++) {
74 struct cache_entry *ce = the_index.cache[i];
9472935d 75
61d450f0
DS
76 if (!include_sparse &&
77 (ce_skip_worktree(ce) ||
78 !path_in_sparse_checkout(ce->name, &the_index)))
d73dbafc 79 continue;
9472935d
TB
80 if (ce_stage(ce))
81 continue; /* do not touch unmerged paths */
82 if (!S_ISREG(ce->ce_mode) && !S_ISLNK(ce->ce_mode))
83 continue; /* do not touch non blobs */
6d2df284 84 if (pathspec && !ce_path_match(&the_index, ce, pathspec, NULL))
9472935d 85 continue;
fbc1ed62
ÆAB
86 retval |= add_file_to_index(&the_index, ce->name,
87 flags | ADD_CACHE_RENORMALIZE);
9472935d
TB
88 }
89
90 return retval;
91}
92
053a6b18 93static char *prune_directory(struct dir_struct *dir, struct pathspec *pathspec, int prefix)
0d781539 94{
f2593398 95 char *seen;
84b8b5d1 96 int i;
0d781539
LT
97 struct dir_entry **src, **dst;
98
84b8b5d1 99 seen = xcalloc(pathspec->nr, 1);
f2593398 100
0d781539
LT
101 src = dst = dir->entries;
102 i = dir->nr;
103 while (--i >= 0) {
104 struct dir_entry *entry = *src++;
6d2df284 105 if (dir_path_match(&the_index, entry, pathspec, prefix, seen))
4d06f8ac 106 *dst++ = entry;
0d781539
LT
107 }
108 dir->nr = dst - dir->entries;
719630eb 109 add_pathspec_matches_against_index(pathspec, &the_index, seen,
a20f7047 110 PS_IGNORE_SKIP_WORKTREE);
81f45e7d 111 return seen;
0d781539
LT
112}
113
a20f7047 114static int refresh(int verbose, const struct pathspec *pathspec)
d616813d
AJ
115{
116 char *seen;
a20f7047
MT
117 int i, ret = 0;
118 char *skip_worktree_seen = NULL;
119 struct string_list only_match_skip_worktree = STRING_LIST_INIT_NODUP;
120 int flags = REFRESH_IGNORE_SKIP_WORKTREE |
121 (verbose ? REFRESH_IN_PORCELAIN : REFRESH_QUIET);
d616813d 122
9b2d6149 123 seen = xcalloc(pathspec->nr, 1);
a20f7047
MT
124 refresh_index(&the_index, flags, pathspec, seen,
125 _("Unstaged changes after refreshing the index:"));
9b2d6149 126 for (i = 0; i < pathspec->nr; i++) {
a20f7047 127 if (!seen[i]) {
939fa075 128 const char *path = pathspec->items[i].original;
939fa075
DS
129
130 if (matches_skip_worktree(pathspec, i, &skip_worktree_seen) ||
02155c8c 131 !path_in_sparse_checkout(path, &the_index)) {
a20f7047
MT
132 string_list_append(&only_match_skip_worktree,
133 pathspec->items[i].original);
134 } else {
135 die(_("pathspec '%s' did not match any files"),
136 pathspec->items[i].original);
137 }
138 }
139 }
140
141 if (only_match_skip_worktree.nr) {
142 advise_on_updating_sparse_paths(&only_match_skip_worktree);
143 ret = 1;
d616813d 144 }
a20f7047 145
ec36c42a 146 free(seen);
a20f7047
MT
147 free(skip_worktree_seen);
148 string_list_clear(&only_match_skip_worktree, 0);
149 return ret;
d616813d
AJ
150}
151
e885a84f 152int interactive_add(const char **argv, const char *prefix, int patch)
46b5139c 153{
5a76aff1 154 struct pathspec pathspec;
20b813d7
ÆAB
155 int unused;
156
157 if (!git_config_get_bool("add.interactive.usebuiltin", &unused))
158 warning(_("the add.interactive.useBuiltin setting has been removed!\n"
159 "See its entry in 'git help config' for details."));
46b5139c 160
625c3304 161 parse_pathspec(&pathspec, 0,
5a76aff1 162 PATHSPEC_PREFER_FULL |
480ca644
NTND
163 PATHSPEC_SYMLINK_LEADING_PATH |
164 PATHSPEC_PREFIX_ORIGIN,
5a76aff1 165 prefix, argv);
46b5139c 166
d21878f0
ÆAB
167 if (patch)
168 return !!run_add_p(the_repository, ADD_P_ADD, NULL, &pathspec);
169 else
170 return !!run_add_i(the_repository, &pathspec);
46b5139c
TR
171}
172
2af202be 173static int edit_patch(int argc, const char **argv, const char *prefix)
c59cb03a 174{
d292bfaf 175 char *file = git_pathdup("ADD_EDIT.patch");
d3180279 176 struct child_process child = CHILD_PROCESS_INIT;
c59cb03a
JS
177 struct rev_info rev;
178 int out;
179 struct stat st;
180
181 git_config(git_diff_basic_config, NULL); /* no "diff" UI options */
182
07047d68 183 if (repo_read_index(the_repository) < 0)
d521abf8 184 die(_("Could not read the index"));
c59cb03a 185
2abf3503 186 repo_init_revisions(the_repository, &rev, prefix);
c59cb03a
JS
187 rev.diffopt.context = 7;
188
189 argc = setup_revisions(argc, argv, &rev, NULL);
190 rev.diffopt.output_format = DIFF_FORMAT_PATCH;
7f3b8c62 191 rev.diffopt.use_color = 0;
0d1e0e78 192 rev.diffopt.flags.ignore_dirty_submodules = 1;
66e905b7 193 out = xopen(file, O_CREAT | O_WRONLY | O_TRUNC, 0666);
41698375 194 rev.diffopt.file = xfdopen(out, "w");
c59cb03a
JS
195 rev.diffopt.close_file = 1;
196 if (run_diff_files(&rev, 0))
d521abf8 197 die(_("Could not write patch"));
c59cb03a 198
cb64800d
JK
199 if (launch_editor(file, NULL, NULL))
200 die(_("editing patch failed"));
c59cb03a
JS
201
202 if (stat(file, &st))
990ac4be 203 die_errno(_("Could not stat '%s'"), file);
c59cb03a 204 if (!st.st_size)
990ac4be 205 die(_("Empty patch. Aborted."));
c59cb03a 206
c59cb03a 207 child.git_cmd = 1;
2b709893
ÆAB
208 strvec_pushl(&child.args, "apply", "--recount", "--cached", file,
209 NULL);
c59cb03a 210 if (run_command(&child))
d521abf8 211 die(_("Could not apply '%s'"), file);
c59cb03a
JS
212
213 unlink(file);
d292bfaf 214 free(file);
2108fe4a 215 release_revisions(&rev);
c59cb03a
JS
216 return 0;
217}
218
b39c53e6 219static const char ignore_error[] =
439fb829 220N_("The following paths are ignored by one of your .gitignore files:\n");
6a1ad325 221
300c0a22 222static int verbose, show_only, ignored_too, refresh_only;
45c45e30 223static int ignore_add_errors, intent_to_add, ignore_missing;
53213994 224static int warn_on_embedded_repo = 1;
45c45e30 225
fdc97abd 226#define ADDREMOVE_DEFAULT 1
45c45e30
JH
227static int addremove = ADDREMOVE_DEFAULT;
228static int addremove_explicit = -1; /* unspecified */
5c46f754 229
4e55ed32
ET
230static char *chmod_arg;
231
9f60f49b
JH
232static int ignore_removal_cb(const struct option *opt, const char *arg, int unset)
233{
234 /* if we are told to ignore, we are not adding removals */
235 *(int *)opt->value = !unset ? 0 : 1;
236 return 0;
237}
238
5c46f754 239static struct option builtin_add_options[] = {
1b56024c
NTND
240 OPT__DRY_RUN(&show_only, N_("dry run")),
241 OPT__VERBOSE(&verbose, N_("be verbose")),
5c46f754 242 OPT_GROUP(""),
300c0a22
JH
243 OPT_BOOL('i', "interactive", &add_interactive, N_("interactive picking")),
244 OPT_BOOL('p', "patch", &patch_interactive, N_("select hunks interactively")),
245 OPT_BOOL('e', "edit", &edit_interactive, N_("edit current diff and apply")),
1224781d 246 OPT__FORCE(&ignored_too, N_("allow adding otherwise ignored files"), 0),
300c0a22 247 OPT_BOOL('u', "update", &take_worktree_changes, N_("update tracked files")),
9472935d 248 OPT_BOOL(0, "renormalize", &add_renormalize, N_("renormalize EOL of tracked files (implies -u)")),
300c0a22 249 OPT_BOOL('N', "intent-to-add", &intent_to_add, N_("record only the fact that the path will be added later")),
45c45e30 250 OPT_BOOL('A', "all", &addremove_explicit, N_("add changes from all tracked and untracked files")),
203c8533 251 OPT_CALLBACK_F(0, "ignore-removal", &addremove_explicit,
9f60f49b
JH
252 NULL /* takes no arguments */,
253 N_("ignore paths removed in the working tree (same as --no-all)"),
203c8533 254 PARSE_OPT_NOARG, ignore_removal_cb),
300c0a22
JH
255 OPT_BOOL( 0 , "refresh", &refresh_only, N_("don't add, only refresh the index")),
256 OPT_BOOL( 0 , "ignore-errors", &ignore_add_errors, N_("just skip files which cannot be added because of errors")),
257 OPT_BOOL( 0 , "ignore-missing", &ignore_missing, N_("check if - even missing - files are ignored in dry run")),
0299a696 258 OPT_BOOL(0, "sparse", &include_sparse, N_("allow updating entries outside of the sparse-checkout cone")),
5f0df44c
RS
259 OPT_STRING(0, "chmod", &chmod_arg, "(+|-)x",
260 N_("override the executable bit of the listed files")),
53213994
JK
261 OPT_HIDDEN_BOOL(0, "warn-embedded-repo", &warn_on_embedded_repo,
262 N_("warn when adding an embedded repository")),
bebb5d6d
AM
263 OPT_PATHSPEC_FROM_FILE(&pathspec_from_file),
264 OPT_PATHSPEC_FILE_NUL(&pathspec_file_nul),
5c46f754
KH
265 OPT_END(),
266};
267
9bd81e42 268static int add_config(const char *var, const char *value, void *cb)
dad25e4a 269{
8c2be75f
JN
270 if (!strcmp(var, "add.ignoreerrors") ||
271 !strcmp(var, "add.ignore-errors")) {
dad25e4a
AR
272 ignore_add_errors = git_config_bool(var, value);
273 return 0;
274 }
f83dff60 275
9bd81e42 276 return git_default_config(var, value, cb);
dad25e4a
AR
277}
278
53213994
JK
279static const char embedded_advice[] = N_(
280"You've added another git repository inside your current repository.\n"
281"Clones of the outer repository will not contain the contents of\n"
282"the embedded repository and will not know how to obtain it.\n"
283"If you meant to add a submodule, use:\n"
284"\n"
285" git submodule add <url> %s\n"
286"\n"
287"If you added this path by mistake, you can remove it from the\n"
288"index with:\n"
289"\n"
290" git rm --cached %s\n"
291"\n"
292"See \"git help submodule\" for more information."
293);
294
295static void check_embedded_repo(const char *path)
296{
297 struct strbuf name = STRBUF_INIT;
c2a4b6d4 298 static int adviced_on_embedded_repo = 0;
53213994
JK
299
300 if (!warn_on_embedded_repo)
301 return;
302 if (!ends_with(path, "/"))
303 return;
304
305 /* Drop trailing slash for aesthetics */
306 strbuf_addstr(&name, path);
307 strbuf_strip_suffix(&name, "/");
308
309 warning(_("adding embedded git repository: %s"), name.buf);
c2a4b6d4
ÆAB
310 if (!adviced_on_embedded_repo &&
311 advice_enabled(ADVICE_ADD_EMBEDDED_REPO)) {
53213994 312 advise(embedded_advice, name.buf, name.buf);
c2a4b6d4 313 adviced_on_embedded_repo = 1;
53213994
JK
314 }
315
316 strbuf_release(&name);
317}
318
610d55af 319static int add_files(struct dir_struct *dir, int flags)
c972ec04
JH
320{
321 int i, exit_status = 0;
105e8b01 322 struct string_list matched_sparse_paths = STRING_LIST_INIT_NODUP;
c972ec04
JH
323
324 if (dir->ignored_nr) {
439fb829 325 fprintf(stderr, _(ignore_error));
c972ec04
JH
326 for (i = 0; i < dir->ignored_nr; i++)
327 fprintf(stderr, "%s\n", dir->ignored[i]->name);
ed9bff08 328 if (advice_enabled(ADVICE_ADD_IGNORED_FILE))
887a0fd5
HW
329 advise(_("Use -f if you really want to add them.\n"
330 "Turn this message off by running\n"
331 "\"git config advice.addIgnoredFile false\""));
1d31e5a2 332 exit_status = 1;
c972ec04
JH
333 }
334
53213994 335 for (i = 0; i < dir->nr; i++) {
0299a696
DS
336 if (!include_sparse &&
337 !path_in_sparse_checkout(dir->entries[i]->name, &the_index)) {
105e8b01
DS
338 string_list_append(&matched_sparse_paths,
339 dir->entries[i]->name);
340 continue;
341 }
610d55af 342 if (add_file_to_index(&the_index, dir->entries[i]->name, flags)) {
c972ec04 343 if (!ignore_add_errors)
990ac4be 344 die(_("adding files failed"));
c972ec04 345 exit_status = 1;
f937bc2f
KM
346 } else {
347 check_embedded_repo(dir->entries[i]->name);
c972ec04 348 }
53213994 349 }
105e8b01
DS
350
351 if (matched_sparse_paths.nr) {
352 advise_on_updating_sparse_paths(&matched_sparse_paths);
353 exit_status = 1;
354 }
355
356 string_list_clear(&matched_sparse_paths, 0);
357
c972ec04
JH
358 return exit_status;
359}
360
a633fca0 361int cmd_add(int argc, const char **argv, const char *prefix)
0d781539 362{
7ae02a30 363 int exit_status = 0;
5a76aff1 364 struct pathspec pathspec;
ce93a4c6 365 struct dir_struct dir = DIR_INIT;
610d55af 366 int flags;
c972ec04
JH
367 int add_new_files;
368 int require_pathspec;
81f45e7d 369 char *seen = NULL;
0fa5a2ed 370 struct lock_file lock_file = LOCK_INIT;
5cde71d6 371
ed342fde
SB
372 git_config(add_config, NULL);
373
37782920 374 argc = parse_options(argc, argv, prefix, builtin_add_options,
c59cb03a 375 builtin_add_usage, PARSE_OPT_KEEP_ARGV0);
b63e9950
WC
376 if (patch_interactive)
377 add_interactive = 1;
bebb5d6d 378 if (add_interactive) {
a1989cf7 379 if (show_only)
12909b6b 380 die(_("options '%s' and '%s' cannot be used together"), "--dry-run", "--interactive/--patch");
bebb5d6d 381 if (pathspec_from_file)
12909b6b 382 die(_("options '%s' and '%s' cannot be used together"), "--pathspec-from-file", "--interactive/--patch");
e885a84f 383 exit(interactive_add(argv + 1, prefix, patch_interactive));
bebb5d6d 384 }
0d781539 385
bebb5d6d
AM
386 if (edit_interactive) {
387 if (pathspec_from_file)
12909b6b 388 die(_("options '%s' and '%s' cannot be used together"), "--pathspec-from-file", "--edit");
c59cb03a 389 return(edit_patch(argc, argv, prefix));
bebb5d6d 390 }
c59cb03a
JS
391 argc--;
392 argv++;
393
45c45e30
JH
394 if (0 <= addremove_explicit)
395 addremove = addremove_explicit;
396 else if (take_worktree_changes && ADDREMOVE_DEFAULT)
397 addremove = 0; /* "-u" was given but not "-A" */
398
3ba1f114 399 if (addremove && take_worktree_changes)
12909b6b 400 die(_("options '%s' and '%s' cannot be used together"), "-A", "-u");
45c45e30 401
108da0db 402 if (!show_only && ignore_missing)
6fa00ee8 403 die(_("the option '%s' requires '%s'"), "--ignore-missing", "--dry-run");
808d3d71 404
610d55af
TG
405 if (chmod_arg && ((chmod_arg[0] != '-' && chmod_arg[0] != '+') ||
406 chmod_arg[1] != 'x' || chmod_arg[2]))
4e55ed32
ET
407 die(_("--chmod param '%s' must be either -x or +x"), chmod_arg);
408
9472935d 409 add_new_files = !take_worktree_changes && !refresh_only && !add_renormalize;
29abb339 410 require_pathspec = !(take_worktree_changes || (0 < addremove_explicit));
c972ec04 411
5e7cbab1
DS
412 prepare_repo_settings(the_repository);
413 the_repository->settings.command_requires_full_index = 0;
414
07047d68 415 repo_hold_locked_index(the_repository, &lock_file, LOCK_DIE_ON_ERROR);
0d781539 416
5a76aff1
NTND
417 /*
418 * Check the "pathspec '%s' did not match any files" block
419 * below before enabling new magic.
420 */
84d938b7 421 parse_pathspec(&pathspec, PATHSPEC_ATTR,
5a76aff1 422 PATHSPEC_PREFER_FULL |
c08397e3 423 PATHSPEC_SYMLINK_LEADING_PATH,
5a76aff1 424 prefix, argv);
366bfcb6 425
bebb5d6d
AM
426 if (pathspec_from_file) {
427 if (pathspec.nr)
246cac85 428 die(_("'%s' and pathspec arguments cannot be used together"), "--pathspec-from-file");
bebb5d6d
AM
429
430 parse_pathspec_file(&pathspec, PATHSPEC_ATTR,
431 PATHSPEC_PREFER_FULL |
432 PATHSPEC_SYMLINK_LEADING_PATH,
433 prefix, pathspec_from_file, pathspec_file_nul);
434 } else if (pathspec_file_nul) {
6fa00ee8 435 die(_("the option '%s' requires '%s'"), "--pathspec-file-nul", "--pathspec-from-file");
bebb5d6d
AM
436 }
437
438 if (require_pathspec && pathspec.nr == 0) {
21bb3083 439 fprintf(stderr, _("Nothing specified, nothing added.\n"));
ed9bff08 440 if (advice_enabled(ADVICE_ADD_EMPTY_PATHSPEC))
887a0fd5
HW
441 advise( _("Maybe you wanted to say 'git add .'?\n"
442 "Turn this message off by running\n"
443 "\"git config advice.addEmptyPathspec false\""));
21bb3083
AM
444 return 0;
445 }
446
bebb5d6d 447 if (!take_worktree_changes && addremove_explicit < 0 && pathspec.nr)
21bb3083
AM
448 /* Turn "git add pathspec..." to "git add -A pathspec..." */
449 addremove = 1;
450
451 flags = ((verbose ? ADD_CACHE_VERBOSE : 0) |
452 (show_only ? ADD_CACHE_PRETEND : 0) |
453 (intent_to_add ? ADD_CACHE_INTENT : 0) |
454 (ignore_add_errors ? ADD_CACHE_IGNORE_ERRORS : 0) |
455 (!(addremove || take_worktree_changes)
456 ? ADD_CACHE_IGNORE_REMOVAL : 0));
457
07047d68 458 if (repo_read_index_preload(the_repository, &pathspec, 0) < 0)
d1664e73
BP
459 die(_("index file corrupt"));
460
461 die_in_unpopulated_submodule(&the_index, prefix);
c08397e3
BW
462 die_path_inside_submodule(&the_index, &pathspec);
463
1d8842d9
LT
464 if (add_new_files) {
465 int baselen;
466
467 /* Set up the default git porcelain excludes */
1d8842d9
LT
468 if (!ignored_too) {
469 dir.flags |= DIR_COLLECT_IGNORED;
470 setup_standard_excludes(&dir);
471 }
472
1e5f764c 473 /* This picks up the paths that are not tracked */
0d32c183 474 baselen = fill_directory(&dir, &the_index, &pathspec);
5a76aff1 475 if (pathspec.nr)
053a6b18 476 seen = prune_directory(&dir, &pathspec, baselen);
1d8842d9 477 }
1e5f764c 478
c972ec04 479 if (refresh_only) {
a20f7047 480 exit_status |= refresh(verbose, &pathspec);
c972ec04 481 goto finish;
6a1ad325
JH
482 }
483
5a76aff1 484 if (pathspec.nr) {
81f45e7d 485 int i;
a20f7047
MT
486 char *skip_worktree_seen = NULL;
487 struct string_list only_match_skip_worktree = STRING_LIST_INIT_NODUP;
eb69934b 488
81f45e7d 489 if (!seen)
719630eb 490 seen = find_pathspecs_matching_against_index(&pathspec,
a20f7047 491 &the_index, PS_IGNORE_SKIP_WORKTREE);
5a76aff1
NTND
492
493 /*
494 * file_exists() assumes exact match
495 */
bd30c2e4
NTND
496 GUARD_PATHSPEC(&pathspec,
497 PATHSPEC_FROMTOP |
498 PATHSPEC_LITERAL |
93d93537 499 PATHSPEC_GLOB |
ef79b1f8
NTND
500 PATHSPEC_ICASE |
501 PATHSPEC_EXCLUDE);
5a76aff1 502
84b8b5d1
NTND
503 for (i = 0; i < pathspec.nr; i++) {
504 const char *path = pathspec.items[i].match;
a20f7047 505
ef79b1f8
NTND
506 if (pathspec.items[i].magic & PATHSPEC_EXCLUDE)
507 continue;
a20f7047
MT
508 if (seen[i])
509 continue;
510
0299a696
DS
511 if (!include_sparse &&
512 matches_skip_worktree(&pathspec, i, &skip_worktree_seen)) {
a20f7047
MT
513 string_list_append(&only_match_skip_worktree,
514 pathspec.items[i].original);
515 continue;
516 }
517
518 /* Don't complain at 'git add .' on empty repo */
519 if (!path[0])
520 continue;
521
522 if ((pathspec.items[i].magic & (PATHSPEC_GLOB | PATHSPEC_ICASE)) ||
523 !file_exists(path)) {
108da0db 524 if (ignore_missing) {
0188f6b3 525 int dtype = DT_UNKNOWN;
a0bba65b 526 if (is_excluded(&dir, &the_index, path, &dtype))
9e58beca
BW
527 dir_add_ignored(&dir, &the_index,
528 path, pathspec.items[i].len);
108da0db 529 } else
48168851 530 die(_("pathspec '%s' did not match any files"),
84b8b5d1 531 pathspec.items[i].original);
108da0db 532 }
81f45e7d 533 }
a20f7047
MT
534
535
536 if (only_match_skip_worktree.nr) {
537 advise_on_updating_sparse_paths(&only_match_skip_worktree);
538 exit_status = 1;
539 }
540
81f45e7d 541 free(seen);
a20f7047
MT
542 free(skip_worktree_seen);
543 string_list_clear(&only_match_skip_worktree, 0);
81f45e7d
JH
544 }
545
2c23d1b4 546 begin_odb_transaction();
568508e7 547
9472935d
TB
548 if (add_renormalize)
549 exit_status |= renormalize_tracked_files(&pathspec, flags);
550 else
50c37ee8
EN
551 exit_status |= add_files_to_cache(the_repository, prefix,
552 &pathspec, include_sparse,
553 flags);
c972ec04
JH
554
555 if (add_new_files)
610d55af 556 exit_status |= add_files(&dir, flags);
0d781539 557
610d55af 558 if (chmod_arg && pathspec.nr)
9ebd7fe1 559 exit_status |= chmod_pathspec(&pathspec, chmod_arg[0], show_only);
2c23d1b4 560 end_odb_transaction();
568508e7 561
d521abf8 562finish:
61000814
563 if (write_locked_index(&the_index, &lock_file,
564 COMMIT_LOCK | SKIP_IF_UNCHANGED))
565 die(_("Unable to write new index file"));
0d781539 566
eceba532 567 dir_clear(&dir);
ac95f5d3 568 clear_pathspec(&pathspec);
7ae02a30 569 return exit_status;
0d781539 570}