t0000: fix test if run with TEST_OUTPUT_DIRECTORY
[alt-git.git] / builtin / add.c
blob09e684585d9ff25e708434000e09f807b1d30a45
1 /*
2 * "git add" builtin command
4 * Copyright (C) 2006 Linus Torvalds
5 */
6 #define USE_THE_INDEX_COMPATIBILITY_MACROS
7 #include "cache.h"
8 #include "config.h"
9 #include "builtin.h"
10 #include "lockfile.h"
11 #include "dir.h"
12 #include "pathspec.h"
13 #include "exec-cmd.h"
14 #include "cache-tree.h"
15 #include "run-command.h"
16 #include "parse-options.h"
17 #include "diff.h"
18 #include "diffcore.h"
19 #include "revision.h"
20 #include "bulk-checkin.h"
21 #include "strvec.h"
22 #include "submodule.h"
23 #include "add-interactive.h"
25 static const char * const builtin_add_usage[] = {
26 N_("git add [<options>] [--] <pathspec>..."),
27 NULL
29 static int patch_interactive, add_interactive, edit_interactive;
30 static int take_worktree_changes;
31 static int add_renormalize;
32 static int pathspec_file_nul;
33 static const char *pathspec_from_file;
34 static int legacy_stash_p; /* support for the scripted `git stash` */
36 struct update_callback_data {
37 int flags;
38 int add_errors;
41 static int chmod_pathspec(struct pathspec *pathspec, char flip, int show_only)
43 int i, ret = 0;
45 for (i = 0; i < active_nr; i++) {
46 struct cache_entry *ce = active_cache[i];
47 int err;
49 if (ce_skip_worktree(ce))
50 continue;
52 if (pathspec && !ce_path_match(&the_index, ce, pathspec, NULL))
53 continue;
55 if (!show_only)
56 err = chmod_cache_entry(ce, flip);
57 else
58 err = S_ISREG(ce->ce_mode) ? 0 : -1;
60 if (err < 0)
61 ret = error(_("cannot chmod %cx '%s'"), flip, ce->name);
64 return ret;
67 static int fix_unmerged_status(struct diff_filepair *p,
68 struct update_callback_data *data)
70 if (p->status != DIFF_STATUS_UNMERGED)
71 return p->status;
72 if (!(data->flags & ADD_CACHE_IGNORE_REMOVAL) && !p->two->mode)
74 * This is not an explicit add request, and the
75 * path is missing from the working tree (deleted)
77 return DIFF_STATUS_DELETED;
78 else
80 * Either an explicit add request, or path exists
81 * in the working tree. An attempt to explicitly
82 * add a path that does not exist in the working tree
83 * will be caught as an error by the caller immediately.
85 return DIFF_STATUS_MODIFIED;
88 static void update_callback(struct diff_queue_struct *q,
89 struct diff_options *opt, void *cbdata)
91 int i;
92 struct update_callback_data *data = cbdata;
94 for (i = 0; i < q->nr; i++) {
95 struct diff_filepair *p = q->queue[i];
96 const char *path = p->one->path;
97 switch (fix_unmerged_status(p, data)) {
98 default:
99 die(_("unexpected diff status %c"), p->status);
100 case DIFF_STATUS_MODIFIED:
101 case DIFF_STATUS_TYPE_CHANGED:
102 if (add_file_to_index(&the_index, path, data->flags)) {
103 if (!(data->flags & ADD_CACHE_IGNORE_ERRORS))
104 die(_("updating files failed"));
105 data->add_errors++;
107 break;
108 case DIFF_STATUS_DELETED:
109 if (data->flags & ADD_CACHE_IGNORE_REMOVAL)
110 break;
111 if (!(data->flags & ADD_CACHE_PRETEND))
112 remove_file_from_index(&the_index, path);
113 if (data->flags & (ADD_CACHE_PRETEND|ADD_CACHE_VERBOSE))
114 printf(_("remove '%s'\n"), path);
115 break;
120 int add_files_to_cache(const char *prefix,
121 const struct pathspec *pathspec, int flags)
123 struct update_callback_data data;
124 struct rev_info rev;
126 memset(&data, 0, sizeof(data));
127 data.flags = flags;
129 repo_init_revisions(the_repository, &rev, prefix);
130 setup_revisions(0, NULL, &rev, NULL);
131 if (pathspec)
132 copy_pathspec(&rev.prune_data, pathspec);
133 rev.diffopt.output_format = DIFF_FORMAT_CALLBACK;
134 rev.diffopt.format_callback = update_callback;
135 rev.diffopt.format_callback_data = &data;
136 rev.diffopt.flags.override_submodule_config = 1;
137 rev.max_count = 0; /* do not compare unmerged paths with stage #2 */
138 run_diff_files(&rev, DIFF_RACY_IS_MODIFIED);
139 clear_pathspec(&rev.prune_data);
140 return !!data.add_errors;
143 static int renormalize_tracked_files(const struct pathspec *pathspec, int flags)
145 int i, retval = 0;
147 /* TODO: audit for interaction with sparse-index. */
148 ensure_full_index(&the_index);
149 for (i = 0; i < active_nr; i++) {
150 struct cache_entry *ce = active_cache[i];
152 if (ce_skip_worktree(ce))
153 continue;
154 if (ce_stage(ce))
155 continue; /* do not touch unmerged paths */
156 if (!S_ISREG(ce->ce_mode) && !S_ISLNK(ce->ce_mode))
157 continue; /* do not touch non blobs */
158 if (pathspec && !ce_path_match(&the_index, ce, pathspec, NULL))
159 continue;
160 retval |= add_file_to_cache(ce->name, flags | ADD_CACHE_RENORMALIZE);
163 return retval;
166 static char *prune_directory(struct dir_struct *dir, struct pathspec *pathspec, int prefix)
168 char *seen;
169 int i;
170 struct dir_entry **src, **dst;
172 seen = xcalloc(pathspec->nr, 1);
174 src = dst = dir->entries;
175 i = dir->nr;
176 while (--i >= 0) {
177 struct dir_entry *entry = *src++;
178 if (dir_path_match(&the_index, entry, pathspec, prefix, seen))
179 *dst++ = entry;
181 dir->nr = dst - dir->entries;
182 add_pathspec_matches_against_index(pathspec, &the_index, seen,
183 PS_IGNORE_SKIP_WORKTREE);
184 return seen;
187 static int refresh(int verbose, const struct pathspec *pathspec)
189 char *seen;
190 int i, ret = 0;
191 char *skip_worktree_seen = NULL;
192 struct string_list only_match_skip_worktree = STRING_LIST_INIT_NODUP;
193 int flags = REFRESH_IGNORE_SKIP_WORKTREE |
194 (verbose ? REFRESH_IN_PORCELAIN : REFRESH_QUIET);
196 seen = xcalloc(pathspec->nr, 1);
197 refresh_index(&the_index, flags, pathspec, seen,
198 _("Unstaged changes after refreshing the index:"));
199 for (i = 0; i < pathspec->nr; i++) {
200 if (!seen[i]) {
201 if (matches_skip_worktree(pathspec, i, &skip_worktree_seen)) {
202 string_list_append(&only_match_skip_worktree,
203 pathspec->items[i].original);
204 } else {
205 die(_("pathspec '%s' did not match any files"),
206 pathspec->items[i].original);
211 if (only_match_skip_worktree.nr) {
212 advise_on_updating_sparse_paths(&only_match_skip_worktree);
213 ret = 1;
216 free(seen);
217 free(skip_worktree_seen);
218 string_list_clear(&only_match_skip_worktree, 0);
219 return ret;
222 int run_add_interactive(const char *revision, const char *patch_mode,
223 const struct pathspec *pathspec)
225 int status, i;
226 struct strvec argv = STRVEC_INIT;
227 int use_builtin_add_i =
228 git_env_bool("GIT_TEST_ADD_I_USE_BUILTIN", -1);
230 if (use_builtin_add_i < 0) {
231 int experimental;
232 if (!git_config_get_bool("add.interactive.usebuiltin",
233 &use_builtin_add_i))
234 ; /* ok */
235 else if (!git_config_get_bool("feature.experimental", &experimental) &&
236 experimental)
237 use_builtin_add_i = 1;
240 if (use_builtin_add_i == 1) {
241 enum add_p_mode mode;
243 if (!patch_mode)
244 return !!run_add_i(the_repository, pathspec);
246 if (!strcmp(patch_mode, "--patch"))
247 mode = ADD_P_ADD;
248 else if (!strcmp(patch_mode, "--patch=stash"))
249 mode = ADD_P_STASH;
250 else if (!strcmp(patch_mode, "--patch=reset"))
251 mode = ADD_P_RESET;
252 else if (!strcmp(patch_mode, "--patch=checkout"))
253 mode = ADD_P_CHECKOUT;
254 else if (!strcmp(patch_mode, "--patch=worktree"))
255 mode = ADD_P_WORKTREE;
256 else
257 die("'%s' not supported", patch_mode);
259 return !!run_add_p(the_repository, mode, revision, pathspec);
262 strvec_push(&argv, "add--interactive");
263 if (patch_mode)
264 strvec_push(&argv, patch_mode);
265 if (revision)
266 strvec_push(&argv, revision);
267 strvec_push(&argv, "--");
268 for (i = 0; i < pathspec->nr; i++)
269 /* pass original pathspec, to be re-parsed */
270 strvec_push(&argv, pathspec->items[i].original);
272 status = run_command_v_opt(argv.v, RUN_GIT_CMD);
273 strvec_clear(&argv);
274 return status;
277 int interactive_add(const char **argv, const char *prefix, int patch)
279 struct pathspec pathspec;
281 parse_pathspec(&pathspec, 0,
282 PATHSPEC_PREFER_FULL |
283 PATHSPEC_SYMLINK_LEADING_PATH |
284 PATHSPEC_PREFIX_ORIGIN,
285 prefix, argv);
287 return run_add_interactive(NULL,
288 patch ? "--patch" : NULL,
289 &pathspec);
292 static int edit_patch(int argc, const char **argv, const char *prefix)
294 char *file = git_pathdup("ADD_EDIT.patch");
295 const char *apply_argv[] = { "apply", "--recount", "--cached",
296 NULL, NULL };
297 struct child_process child = CHILD_PROCESS_INIT;
298 struct rev_info rev;
299 int out;
300 struct stat st;
302 apply_argv[3] = file;
304 git_config(git_diff_basic_config, NULL); /* no "diff" UI options */
306 if (read_cache() < 0)
307 die(_("Could not read the index"));
309 repo_init_revisions(the_repository, &rev, prefix);
310 rev.diffopt.context = 7;
312 argc = setup_revisions(argc, argv, &rev, NULL);
313 rev.diffopt.output_format = DIFF_FORMAT_PATCH;
314 rev.diffopt.use_color = 0;
315 rev.diffopt.flags.ignore_dirty_submodules = 1;
316 out = open(file, O_CREAT | O_WRONLY | O_TRUNC, 0666);
317 if (out < 0)
318 die(_("Could not open '%s' for writing."), file);
319 rev.diffopt.file = xfdopen(out, "w");
320 rev.diffopt.close_file = 1;
321 if (run_diff_files(&rev, 0))
322 die(_("Could not write patch"));
324 if (launch_editor(file, NULL, NULL))
325 die(_("editing patch failed"));
327 if (stat(file, &st))
328 die_errno(_("Could not stat '%s'"), file);
329 if (!st.st_size)
330 die(_("Empty patch. Aborted."));
332 child.git_cmd = 1;
333 child.argv = apply_argv;
334 if (run_command(&child))
335 die(_("Could not apply '%s'"), file);
337 unlink(file);
338 free(file);
339 return 0;
342 static const char ignore_error[] =
343 N_("The following paths are ignored by one of your .gitignore files:\n");
345 static int verbose, show_only, ignored_too, refresh_only;
346 static int ignore_add_errors, intent_to_add, ignore_missing;
347 static int warn_on_embedded_repo = 1;
349 #define ADDREMOVE_DEFAULT 1
350 static int addremove = ADDREMOVE_DEFAULT;
351 static int addremove_explicit = -1; /* unspecified */
353 static char *chmod_arg;
355 static int ignore_removal_cb(const struct option *opt, const char *arg, int unset)
357 /* if we are told to ignore, we are not adding removals */
358 *(int *)opt->value = !unset ? 0 : 1;
359 return 0;
362 static struct option builtin_add_options[] = {
363 OPT__DRY_RUN(&show_only, N_("dry run")),
364 OPT__VERBOSE(&verbose, N_("be verbose")),
365 OPT_GROUP(""),
366 OPT_BOOL('i', "interactive", &add_interactive, N_("interactive picking")),
367 OPT_BOOL('p', "patch", &patch_interactive, N_("select hunks interactively")),
368 OPT_BOOL('e', "edit", &edit_interactive, N_("edit current diff and apply")),
369 OPT__FORCE(&ignored_too, N_("allow adding otherwise ignored files"), 0),
370 OPT_BOOL('u', "update", &take_worktree_changes, N_("update tracked files")),
371 OPT_BOOL(0, "renormalize", &add_renormalize, N_("renormalize EOL of tracked files (implies -u)")),
372 OPT_BOOL('N', "intent-to-add", &intent_to_add, N_("record only the fact that the path will be added later")),
373 OPT_BOOL('A', "all", &addremove_explicit, N_("add changes from all tracked and untracked files")),
374 OPT_CALLBACK_F(0, "ignore-removal", &addremove_explicit,
375 NULL /* takes no arguments */,
376 N_("ignore paths removed in the working tree (same as --no-all)"),
377 PARSE_OPT_NOARG, ignore_removal_cb),
378 OPT_BOOL( 0 , "refresh", &refresh_only, N_("don't add, only refresh the index")),
379 OPT_BOOL( 0 , "ignore-errors", &ignore_add_errors, N_("just skip files which cannot be added because of errors")),
380 OPT_BOOL( 0 , "ignore-missing", &ignore_missing, N_("check if - even missing - files are ignored in dry run")),
381 OPT_STRING(0, "chmod", &chmod_arg, "(+|-)x",
382 N_("override the executable bit of the listed files")),
383 OPT_HIDDEN_BOOL(0, "warn-embedded-repo", &warn_on_embedded_repo,
384 N_("warn when adding an embedded repository")),
385 OPT_HIDDEN_BOOL(0, "legacy-stash-p", &legacy_stash_p,
386 N_("backend for `git stash -p`")),
387 OPT_PATHSPEC_FROM_FILE(&pathspec_from_file),
388 OPT_PATHSPEC_FILE_NUL(&pathspec_file_nul),
389 OPT_END(),
392 static int add_config(const char *var, const char *value, void *cb)
394 if (!strcmp(var, "add.ignoreerrors") ||
395 !strcmp(var, "add.ignore-errors")) {
396 ignore_add_errors = git_config_bool(var, value);
397 return 0;
400 return git_default_config(var, value, cb);
403 static const char embedded_advice[] = N_(
404 "You've added another git repository inside your current repository.\n"
405 "Clones of the outer repository will not contain the contents of\n"
406 "the embedded repository and will not know how to obtain it.\n"
407 "If you meant to add a submodule, use:\n"
408 "\n"
409 " git submodule add <url> %s\n"
410 "\n"
411 "If you added this path by mistake, you can remove it from the\n"
412 "index with:\n"
413 "\n"
414 " git rm --cached %s\n"
415 "\n"
416 "See \"git help submodule\" for more information."
419 static void check_embedded_repo(const char *path)
421 struct strbuf name = STRBUF_INIT;
423 if (!warn_on_embedded_repo)
424 return;
425 if (!ends_with(path, "/"))
426 return;
428 /* Drop trailing slash for aesthetics */
429 strbuf_addstr(&name, path);
430 strbuf_strip_suffix(&name, "/");
432 warning(_("adding embedded git repository: %s"), name.buf);
433 if (advice_add_embedded_repo) {
434 advise(embedded_advice, name.buf, name.buf);
435 /* there may be multiple entries; advise only once */
436 advice_add_embedded_repo = 0;
439 strbuf_release(&name);
442 static int add_files(struct dir_struct *dir, int flags)
444 int i, exit_status = 0;
446 if (dir->ignored_nr) {
447 fprintf(stderr, _(ignore_error));
448 for (i = 0; i < dir->ignored_nr; i++)
449 fprintf(stderr, "%s\n", dir->ignored[i]->name);
450 if (advice_add_ignored_file)
451 advise(_("Use -f if you really want to add them.\n"
452 "Turn this message off by running\n"
453 "\"git config advice.addIgnoredFile false\""));
454 exit_status = 1;
457 for (i = 0; i < dir->nr; i++) {
458 if (add_file_to_index(&the_index, dir->entries[i]->name, flags)) {
459 if (!ignore_add_errors)
460 die(_("adding files failed"));
461 exit_status = 1;
462 } else {
463 check_embedded_repo(dir->entries[i]->name);
466 return exit_status;
469 int cmd_add(int argc, const char **argv, const char *prefix)
471 int exit_status = 0;
472 struct pathspec pathspec;
473 struct dir_struct dir = DIR_INIT;
474 int flags;
475 int add_new_files;
476 int require_pathspec;
477 char *seen = NULL;
478 struct lock_file lock_file = LOCK_INIT;
480 git_config(add_config, NULL);
482 argc = parse_options(argc, argv, prefix, builtin_add_options,
483 builtin_add_usage, PARSE_OPT_KEEP_ARGV0);
484 if (patch_interactive)
485 add_interactive = 1;
486 if (add_interactive) {
487 if (show_only)
488 die(_("--dry-run is incompatible with --interactive/--patch"));
489 if (pathspec_from_file)
490 die(_("--pathspec-from-file is incompatible with --interactive/--patch"));
491 exit(interactive_add(argv + 1, prefix, patch_interactive));
493 if (legacy_stash_p) {
494 struct pathspec pathspec;
496 parse_pathspec(&pathspec, 0,
497 PATHSPEC_PREFER_FULL |
498 PATHSPEC_SYMLINK_LEADING_PATH |
499 PATHSPEC_PREFIX_ORIGIN,
500 prefix, argv);
502 return run_add_interactive(NULL, "--patch=stash", &pathspec);
505 if (edit_interactive) {
506 if (pathspec_from_file)
507 die(_("--pathspec-from-file is incompatible with --edit"));
508 return(edit_patch(argc, argv, prefix));
510 argc--;
511 argv++;
513 if (0 <= addremove_explicit)
514 addremove = addremove_explicit;
515 else if (take_worktree_changes && ADDREMOVE_DEFAULT)
516 addremove = 0; /* "-u" was given but not "-A" */
518 if (addremove && take_worktree_changes)
519 die(_("-A and -u are mutually incompatible"));
521 if (!show_only && ignore_missing)
522 die(_("Option --ignore-missing can only be used together with --dry-run"));
524 if (chmod_arg && ((chmod_arg[0] != '-' && chmod_arg[0] != '+') ||
525 chmod_arg[1] != 'x' || chmod_arg[2]))
526 die(_("--chmod param '%s' must be either -x or +x"), chmod_arg);
528 add_new_files = !take_worktree_changes && !refresh_only && !add_renormalize;
529 require_pathspec = !(take_worktree_changes || (0 < addremove_explicit));
531 hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR);
534 * Check the "pathspec '%s' did not match any files" block
535 * below before enabling new magic.
537 parse_pathspec(&pathspec, PATHSPEC_ATTR,
538 PATHSPEC_PREFER_FULL |
539 PATHSPEC_SYMLINK_LEADING_PATH,
540 prefix, argv);
542 if (pathspec_from_file) {
543 if (pathspec.nr)
544 die(_("--pathspec-from-file is incompatible with pathspec arguments"));
546 parse_pathspec_file(&pathspec, PATHSPEC_ATTR,
547 PATHSPEC_PREFER_FULL |
548 PATHSPEC_SYMLINK_LEADING_PATH,
549 prefix, pathspec_from_file, pathspec_file_nul);
550 } else if (pathspec_file_nul) {
551 die(_("--pathspec-file-nul requires --pathspec-from-file"));
554 if (require_pathspec && pathspec.nr == 0) {
555 fprintf(stderr, _("Nothing specified, nothing added.\n"));
556 if (advice_add_empty_pathspec)
557 advise( _("Maybe you wanted to say 'git add .'?\n"
558 "Turn this message off by running\n"
559 "\"git config advice.addEmptyPathspec false\""));
560 return 0;
563 if (!take_worktree_changes && addremove_explicit < 0 && pathspec.nr)
564 /* Turn "git add pathspec..." to "git add -A pathspec..." */
565 addremove = 1;
567 flags = ((verbose ? ADD_CACHE_VERBOSE : 0) |
568 (show_only ? ADD_CACHE_PRETEND : 0) |
569 (intent_to_add ? ADD_CACHE_INTENT : 0) |
570 (ignore_add_errors ? ADD_CACHE_IGNORE_ERRORS : 0) |
571 (!(addremove || take_worktree_changes)
572 ? ADD_CACHE_IGNORE_REMOVAL : 0));
574 if (read_cache_preload(&pathspec) < 0)
575 die(_("index file corrupt"));
577 die_in_unpopulated_submodule(&the_index, prefix);
578 die_path_inside_submodule(&the_index, &pathspec);
580 if (add_new_files) {
581 int baselen;
583 /* Set up the default git porcelain excludes */
584 if (!ignored_too) {
585 dir.flags |= DIR_COLLECT_IGNORED;
586 setup_standard_excludes(&dir);
589 /* This picks up the paths that are not tracked */
590 baselen = fill_directory(&dir, &the_index, &pathspec);
591 if (pathspec.nr)
592 seen = prune_directory(&dir, &pathspec, baselen);
595 if (refresh_only) {
596 exit_status |= refresh(verbose, &pathspec);
597 goto finish;
600 if (pathspec.nr) {
601 int i;
602 char *skip_worktree_seen = NULL;
603 struct string_list only_match_skip_worktree = STRING_LIST_INIT_NODUP;
605 if (!seen)
606 seen = find_pathspecs_matching_against_index(&pathspec,
607 &the_index, PS_IGNORE_SKIP_WORKTREE);
610 * file_exists() assumes exact match
612 GUARD_PATHSPEC(&pathspec,
613 PATHSPEC_FROMTOP |
614 PATHSPEC_LITERAL |
615 PATHSPEC_GLOB |
616 PATHSPEC_ICASE |
617 PATHSPEC_EXCLUDE);
619 for (i = 0; i < pathspec.nr; i++) {
620 const char *path = pathspec.items[i].match;
622 if (pathspec.items[i].magic & PATHSPEC_EXCLUDE)
623 continue;
624 if (seen[i])
625 continue;
627 if (matches_skip_worktree(&pathspec, i, &skip_worktree_seen)) {
628 string_list_append(&only_match_skip_worktree,
629 pathspec.items[i].original);
630 continue;
633 /* Don't complain at 'git add .' on empty repo */
634 if (!path[0])
635 continue;
637 if ((pathspec.items[i].magic & (PATHSPEC_GLOB | PATHSPEC_ICASE)) ||
638 !file_exists(path)) {
639 if (ignore_missing) {
640 int dtype = DT_UNKNOWN;
641 if (is_excluded(&dir, &the_index, path, &dtype))
642 dir_add_ignored(&dir, &the_index,
643 path, pathspec.items[i].len);
644 } else
645 die(_("pathspec '%s' did not match any files"),
646 pathspec.items[i].original);
651 if (only_match_skip_worktree.nr) {
652 advise_on_updating_sparse_paths(&only_match_skip_worktree);
653 exit_status = 1;
656 free(seen);
657 free(skip_worktree_seen);
658 string_list_clear(&only_match_skip_worktree, 0);
661 plug_bulk_checkin();
663 if (add_renormalize)
664 exit_status |= renormalize_tracked_files(&pathspec, flags);
665 else
666 exit_status |= add_files_to_cache(prefix, &pathspec, flags);
668 if (add_new_files)
669 exit_status |= add_files(&dir, flags);
671 if (chmod_arg && pathspec.nr)
672 exit_status |= chmod_pathspec(&pathspec, chmod_arg[0], show_only);
673 unplug_bulk_checkin();
675 finish:
676 if (write_locked_index(&the_index, &lock_file,
677 COMMIT_LOCK | SKIP_IF_UNCHANGED))
678 die(_("Unable to write new index file"));
680 dir_clear(&dir);
681 UNLEAK(pathspec);
682 return exit_status;