2 * "git add" builtin command
4 * Copyright (C) 2006 Linus Torvalds
11 #include "cache-tree.h"
12 #include "run-command.h"
13 #include "parse-options.h"
17 #include "bulk-checkin.h"
19 static const char * const builtin_add_usage[] = {
20 N_("git add [options] [--] <pathspec>..."),
23 static int patch_interactive, add_interactive, edit_interactive;
24 static int take_worktree_changes;
26 struct update_callback_data {
31 static const char *option_with_implicit_dot;
32 static const char *short_option_with_implicit_dot;
34 static void warn_pathless_add(void)
37 assert(option_with_implicit_dot && short_option_with_implicit_dot);
44 * To be consistent with "git add -p" and most Git
45 * commands, we should default to being tree-wide, but
46 * this is not the original behavior and can't be
47 * changed until users trained themselves not to type
48 * "git add -u" or "git add -A". For now, we warn and
49 * keep the old behavior. Later, the behavior can be changed
50 * to tree-wide, keeping the warning for a while, and
51 * eventually we can drop the warning.
53 warning(_("The behavior of 'git add %s (or %s)' with no path argument from a\n"
54 "subdirectory of the tree will change in Git 2.0 and should not be used anymore.\n"
55 "To add content for the whole tree, run:\n"
58 " (or git add %s :/)\n"
60 "To restrict the command to the current directory, run:\n"
63 " (or git add %s .)\n"
65 "With the current Git version, the command is restricted to "
66 "the current directory.\n"
68 option_with_implicit_dot, short_option_with_implicit_dot,
69 option_with_implicit_dot, short_option_with_implicit_dot,
70 option_with_implicit_dot, short_option_with_implicit_dot);
73 static int fix_unmerged_status(struct diff_filepair *p,
74 struct update_callback_data *data)
76 if (p->status != DIFF_STATUS_UNMERGED)
78 if (!(data->flags & ADD_CACHE_IGNORE_REMOVAL) && !p->two->mode)
80 * This is not an explicit add request, and the
81 * path is missing from the working tree (deleted)
83 return DIFF_STATUS_DELETED;
86 * Either an explicit add request, or path exists
87 * in the working tree. An attempt to explicitly
88 * add a path that does not exist in the working tree
89 * will be caught as an error by the caller immediately.
91 return DIFF_STATUS_MODIFIED;
94 static void update_callback(struct diff_queue_struct *q,
95 struct diff_options *opt, void *cbdata)
98 struct update_callback_data *data = cbdata;
100 for (i = 0; i < q->nr; i++) {
101 struct diff_filepair *p = q->queue[i];
102 const char *path = p->one->path;
103 switch (fix_unmerged_status(p, data)) {
105 die(_("unexpected diff status %c"), p->status);
106 case DIFF_STATUS_MODIFIED:
107 case DIFF_STATUS_TYPE_CHANGED:
108 if (add_file_to_index(&the_index, path, data->flags)) {
109 if (!(data->flags & ADD_CACHE_IGNORE_ERRORS))
110 die(_("updating files failed"));
114 case DIFF_STATUS_DELETED:
115 if (data->flags & ADD_CACHE_IGNORE_REMOVAL)
117 if (!(data->flags & ADD_CACHE_PRETEND))
118 remove_file_from_index(&the_index, path);
119 if (data->flags & (ADD_CACHE_PRETEND|ADD_CACHE_VERBOSE))
120 printf(_("remove '%s'\n"), path);
126 int add_files_to_cache(const char *prefix, const char **pathspec, int flags)
128 struct update_callback_data data;
130 init_revisions(&rev, prefix);
131 setup_revisions(0, NULL, &rev, NULL);
132 init_pathspec(&rev.prune_data, pathspec);
133 rev.diffopt.output_format = DIFF_FORMAT_CALLBACK;
134 rev.diffopt.format_callback = update_callback;
137 rev.diffopt.format_callback_data = &data;
138 rev.max_count = 0; /* do not compare unmerged paths with stage #2 */
139 run_diff_files(&rev, DIFF_RACY_IS_MODIFIED);
140 return !!data.add_errors;
143 static char *prune_directory(struct dir_struct *dir, const char **pathspec, int prefix)
147 struct dir_entry **src, **dst;
149 for (specs = 0; pathspec[specs]; specs++)
151 seen = xcalloc(specs, 1);
153 src = dst = dir->entries;
156 struct dir_entry *entry = *src++;
157 if (match_pathspec(pathspec, entry->name, entry->len,
161 dir->nr = dst - dir->entries;
162 add_pathspec_matches_against_index(pathspec, seen, specs);
167 * Checks the index to see whether any path in pathspec refers to
168 * something inside a submodule. If so, dies with an error message.
170 static void treat_gitlinks(const char **pathspec)
174 if (!pathspec || !*pathspec)
177 for (i = 0; pathspec[i]; i++)
178 pathspec[i] = check_path_for_gitlink(pathspec[i]);
181 static void refresh(int verbose, const char **pathspec)
186 for (specs = 0; pathspec[specs]; specs++)
188 seen = xcalloc(specs, 1);
189 refresh_index(&the_index, verbose ? REFRESH_IN_PORCELAIN : REFRESH_QUIET,
190 pathspec, seen, _("Unstaged changes after refreshing the index:"));
191 for (i = 0; i < specs; i++) {
193 die(_("pathspec '%s' did not match any files"), pathspec[i]);
199 * Normalizes argv relative to prefix, via get_pathspec(), and then
200 * runs die_if_path_beyond_symlink() on each path in the normalized
203 static const char **validate_pathspec(const char **argv, const char *prefix)
205 const char **pathspec = get_pathspec(prefix, argv);
209 for (p = pathspec; *p; p++) {
210 die_if_path_beyond_symlink(*p, prefix);
217 int run_add_interactive(const char *revision, const char *patch_mode,
218 const char **pathspec)
220 int status, ac, pc = 0;
227 args = xcalloc(sizeof(const char *), (pc + 5));
229 args[ac++] = "add--interactive";
231 args[ac++] = patch_mode;
233 args[ac++] = revision;
236 memcpy(&(args[ac]), pathspec, sizeof(const char *) * pc);
241 status = run_command_v_opt(args, RUN_GIT_CMD);
246 int interactive_add(int argc, const char **argv, const char *prefix, int patch)
248 const char **pathspec = NULL;
251 pathspec = validate_pathspec(argv, prefix);
256 return run_add_interactive(NULL,
257 patch ? "--patch" : NULL,
261 static int edit_patch(int argc, const char **argv, const char *prefix)
263 char *file = git_pathdup("ADD_EDIT.patch");
264 const char *apply_argv[] = { "apply", "--recount", "--cached",
266 struct child_process child;
271 apply_argv[3] = file;
273 git_config(git_diff_basic_config, NULL); /* no "diff" UI options */
275 if (read_cache() < 0)
276 die (_("Could not read the index"));
278 init_revisions(&rev, prefix);
279 rev.diffopt.context = 7;
281 argc = setup_revisions(argc, argv, &rev, NULL);
282 rev.diffopt.output_format = DIFF_FORMAT_PATCH;
283 DIFF_OPT_SET(&rev.diffopt, IGNORE_DIRTY_SUBMODULES);
284 out = open(file, O_CREAT | O_WRONLY, 0666);
286 die (_("Could not open '%s' for writing."), file);
287 rev.diffopt.file = xfdopen(out, "w");
288 rev.diffopt.close_file = 1;
289 if (run_diff_files(&rev, 0))
290 die (_("Could not write patch"));
292 launch_editor(file, NULL, NULL);
295 die_errno(_("Could not stat '%s'"), file);
297 die(_("Empty patch. Aborted."));
299 memset(&child, 0, sizeof(child));
301 child.argv = apply_argv;
302 if (run_command(&child))
303 die (_("Could not apply '%s'"), file);
310 static struct lock_file lock_file;
312 static const char ignore_error[] =
313 N_("The following paths are ignored by one of your .gitignore files:\n");
315 static int verbose = 0, show_only = 0, ignored_too = 0, refresh_only = 0;
316 static int ignore_add_errors, addremove, intent_to_add, ignore_missing = 0;
318 static struct option builtin_add_options[] = {
319 OPT__DRY_RUN(&show_only, N_("dry run")),
320 OPT__VERBOSE(&verbose, N_("be verbose")),
322 OPT_BOOLEAN('i', "interactive", &add_interactive, N_("interactive picking")),
323 OPT_BOOLEAN('p', "patch", &patch_interactive, N_("select hunks interactively")),
324 OPT_BOOLEAN('e', "edit", &edit_interactive, N_("edit current diff and apply")),
325 OPT__FORCE(&ignored_too, N_("allow adding otherwise ignored files")),
326 OPT_BOOLEAN('u', "update", &take_worktree_changes, N_("update tracked files")),
327 OPT_BOOLEAN('N', "intent-to-add", &intent_to_add, N_("record only the fact that the path will be added later")),
328 OPT_BOOLEAN('A', "all", &addremove, N_("add changes from all tracked and untracked files")),
329 OPT_BOOLEAN( 0 , "refresh", &refresh_only, N_("don't add, only refresh the index")),
330 OPT_BOOLEAN( 0 , "ignore-errors", &ignore_add_errors, N_("just skip files which cannot be added because of errors")),
331 OPT_BOOLEAN( 0 , "ignore-missing", &ignore_missing, N_("check if - even missing - files are ignored in dry run")),
335 static int add_config(const char *var, const char *value, void *cb)
337 if (!strcmp(var, "add.ignoreerrors") ||
338 !strcmp(var, "add.ignore-errors")) {
339 ignore_add_errors = git_config_bool(var, value);
342 return git_default_config(var, value, cb);
345 static int add_files(struct dir_struct *dir, int flags)
347 int i, exit_status = 0;
349 if (dir->ignored_nr) {
350 fprintf(stderr, _(ignore_error));
351 for (i = 0; i < dir->ignored_nr; i++)
352 fprintf(stderr, "%s\n", dir->ignored[i]->name);
353 fprintf(stderr, _("Use -f if you really want to add them.\n"));
354 die(_("no files added"));
357 for (i = 0; i < dir->nr; i++)
358 if (add_file_to_cache(dir->entries[i]->name, flags)) {
359 if (!ignore_add_errors)
360 die(_("adding files failed"));
366 int cmd_add(int argc, const char **argv, const char *prefix)
370 const char **pathspec;
371 struct dir_struct dir;
374 int require_pathspec;
377 git_config(add_config, NULL);
379 argc = parse_options(argc, argv, prefix, builtin_add_options,
380 builtin_add_usage, PARSE_OPT_KEEP_ARGV0);
381 if (patch_interactive)
384 exit(interactive_add(argc - 1, argv + 1, prefix, patch_interactive));
386 if (edit_interactive)
387 return(edit_patch(argc, argv, prefix));
391 if (addremove && take_worktree_changes)
392 die(_("-A and -u are mutually incompatible"));
393 if (!show_only && ignore_missing)
394 die(_("Option --ignore-missing can only be used together with --dry-run"));
396 option_with_implicit_dot = "--all";
397 short_option_with_implicit_dot = "-A";
399 if (take_worktree_changes) {
400 option_with_implicit_dot = "--update";
401 short_option_with_implicit_dot = "-u";
403 if (option_with_implicit_dot && !argc) {
404 static const char *here[2] = { ".", NULL };
411 add_new_files = !take_worktree_changes && !refresh_only;
412 require_pathspec = !take_worktree_changes;
414 newfd = hold_locked_index(&lock_file, 1);
416 flags = ((verbose ? ADD_CACHE_VERBOSE : 0) |
417 (show_only ? ADD_CACHE_PRETEND : 0) |
418 (intent_to_add ? ADD_CACHE_INTENT : 0) |
419 (ignore_add_errors ? ADD_CACHE_IGNORE_ERRORS : 0) |
420 (!(addremove || take_worktree_changes)
421 ? ADD_CACHE_IGNORE_REMOVAL : 0));
423 if (require_pathspec && argc == 0) {
424 fprintf(stderr, _("Nothing specified, nothing added.\n"));
425 fprintf(stderr, _("Maybe you wanted to say 'git add .'?\n"));
428 pathspec = validate_pathspec(argv, prefix);
430 if (read_cache() < 0)
431 die(_("index file corrupt"));
432 treat_gitlinks(pathspec);
437 /* Set up the default git porcelain excludes */
438 memset(&dir, 0, sizeof(dir));
440 dir.flags |= DIR_COLLECT_IGNORED;
441 setup_standard_excludes(&dir);
444 /* This picks up the paths that are not tracked */
445 baselen = fill_directory(&dir, pathspec);
447 seen = prune_directory(&dir, pathspec, baselen);
451 refresh(verbose, pathspec);
457 struct path_exclude_check check;
459 path_exclude_check_init(&check, &dir);
461 seen = find_pathspecs_matching_against_index(pathspec);
462 for (i = 0; pathspec[i]; i++) {
463 if (!seen[i] && pathspec[i][0]
464 && !file_exists(pathspec[i])) {
465 if (ignore_missing) {
466 int dtype = DT_UNKNOWN;
467 if (is_path_excluded(&check, pathspec[i], -1, &dtype))
468 dir_add_ignored(&dir, pathspec[i], strlen(pathspec[i]));
470 die(_("pathspec '%s' did not match any files"),
475 path_exclude_check_clear(&check);
480 exit_status |= add_files_to_cache(prefix, pathspec, flags);
483 exit_status |= add_files(&dir, flags);
485 unplug_bulk_checkin();
488 if (active_cache_changed) {
489 if (write_cache(newfd, active_cache, active_nr) ||
490 commit_locked_index(&lock_file))
491 die(_("Unable to write new index file"));