add: add a blank line at the end of pathless 'add [-u|-A]' warning
[git/raj.git] / builtin / add.c
blobc13d5485858879a7889e00b0c99372ecd41f1985
1 /*
2 * "git add" builtin command
4 * Copyright (C) 2006 Linus Torvalds
5 */
6 #include "cache.h"
7 #include "builtin.h"
8 #include "dir.h"
9 #include "pathspec.h"
10 #include "exec_cmd.h"
11 #include "cache-tree.h"
12 #include "run-command.h"
13 #include "parse-options.h"
14 #include "diff.h"
15 #include "diffcore.h"
16 #include "revision.h"
17 #include "bulk-checkin.h"
19 static const char * const builtin_add_usage[] = {
20 N_("git add [options] [--] <pathspec>..."),
21 NULL
23 static int patch_interactive, add_interactive, edit_interactive;
24 static int take_worktree_changes;
26 struct update_callback_data {
27 int flags;
28 int add_errors;
31 static const char *option_with_implicit_dot;
32 static const char *short_option_with_implicit_dot;
34 static void warn_pathless_add(void)
36 assert(option_with_implicit_dot && short_option_with_implicit_dot);
39 * To be consistent with "git add -p" and most Git
40 * commands, we should default to being tree-wide, but
41 * this is not the original behavior and can't be
42 * changed until users trained themselves not to type
43 * "git add -u" or "git add -A". For now, we warn and
44 * keep the old behavior. Later, the behavior can be changed
45 * to tree-wide, keeping the warning for a while, and
46 * eventually we can drop the warning.
48 warning(_("The behavior of 'git add %s (or %s)' with no path argument from a\n"
49 "subdirectory of the tree will change in Git 2.0 and should not be used anymore.\n"
50 "To add content for the whole tree, run:\n"
51 "\n"
52 " git add %s :/\n"
53 " (or git add %s :/)\n"
54 "\n"
55 "To restrict the command to the current directory, run:\n"
56 "\n"
57 " git add %s .\n"
58 " (or git add %s .)\n"
59 "\n"
60 "With the current Git version, the command is restricted to "
61 "the current directory.\n"
62 ""),
63 option_with_implicit_dot, short_option_with_implicit_dot,
64 option_with_implicit_dot, short_option_with_implicit_dot,
65 option_with_implicit_dot, short_option_with_implicit_dot);
68 static int fix_unmerged_status(struct diff_filepair *p,
69 struct update_callback_data *data)
71 if (p->status != DIFF_STATUS_UNMERGED)
72 return p->status;
73 if (!(data->flags & ADD_CACHE_IGNORE_REMOVAL) && !p->two->mode)
75 * This is not an explicit add request, and the
76 * path is missing from the working tree (deleted)
78 return DIFF_STATUS_DELETED;
79 else
81 * Either an explicit add request, or path exists
82 * in the working tree. An attempt to explicitly
83 * add a path that does not exist in the working tree
84 * will be caught as an error by the caller immediately.
86 return DIFF_STATUS_MODIFIED;
89 static void update_callback(struct diff_queue_struct *q,
90 struct diff_options *opt, void *cbdata)
92 int i;
93 struct update_callback_data *data = cbdata;
95 for (i = 0; i < q->nr; i++) {
96 struct diff_filepair *p = q->queue[i];
97 const char *path = p->one->path;
98 switch (fix_unmerged_status(p, data)) {
99 default:
100 die(_("unexpected diff status %c"), p->status);
101 case DIFF_STATUS_MODIFIED:
102 case DIFF_STATUS_TYPE_CHANGED:
103 if (add_file_to_index(&the_index, path, data->flags)) {
104 if (!(data->flags & ADD_CACHE_IGNORE_ERRORS))
105 die(_("updating files failed"));
106 data->add_errors++;
108 break;
109 case DIFF_STATUS_DELETED:
110 if (data->flags & ADD_CACHE_IGNORE_REMOVAL)
111 break;
112 if (!(data->flags & ADD_CACHE_PRETEND))
113 remove_file_from_index(&the_index, path);
114 if (data->flags & (ADD_CACHE_PRETEND|ADD_CACHE_VERBOSE))
115 printf(_("remove '%s'\n"), path);
116 break;
121 int add_files_to_cache(const char *prefix, const char **pathspec, int flags)
123 struct update_callback_data data;
124 struct rev_info rev;
125 init_revisions(&rev, prefix);
126 setup_revisions(0, NULL, &rev, NULL);
127 init_pathspec(&rev.prune_data, pathspec);
128 rev.diffopt.output_format = DIFF_FORMAT_CALLBACK;
129 rev.diffopt.format_callback = update_callback;
130 data.flags = flags;
131 data.add_errors = 0;
132 rev.diffopt.format_callback_data = &data;
133 rev.max_count = 0; /* do not compare unmerged paths with stage #2 */
134 run_diff_files(&rev, DIFF_RACY_IS_MODIFIED);
135 return !!data.add_errors;
138 static char *prune_directory(struct dir_struct *dir, const char **pathspec, int prefix)
140 char *seen;
141 int i, specs;
142 struct dir_entry **src, **dst;
144 for (specs = 0; pathspec[specs]; specs++)
145 /* nothing */;
146 seen = xcalloc(specs, 1);
148 src = dst = dir->entries;
149 i = dir->nr;
150 while (--i >= 0) {
151 struct dir_entry *entry = *src++;
152 if (match_pathspec(pathspec, entry->name, entry->len,
153 prefix, seen))
154 *dst++ = entry;
156 dir->nr = dst - dir->entries;
157 add_pathspec_matches_against_index(pathspec, seen, specs);
158 return seen;
162 * Checks the index to see whether any path in pathspec refers to
163 * something inside a submodule. If so, dies with an error message.
165 static void treat_gitlinks(const char **pathspec)
167 int i;
169 if (!pathspec || !*pathspec)
170 return;
172 for (i = 0; pathspec[i]; i++)
173 pathspec[i] = check_path_for_gitlink(pathspec[i]);
176 static void refresh(int verbose, const char **pathspec)
178 char *seen;
179 int i, specs;
181 for (specs = 0; pathspec[specs]; specs++)
182 /* nothing */;
183 seen = xcalloc(specs, 1);
184 refresh_index(&the_index, verbose ? REFRESH_IN_PORCELAIN : REFRESH_QUIET,
185 pathspec, seen, _("Unstaged changes after refreshing the index:"));
186 for (i = 0; i < specs; i++) {
187 if (!seen[i])
188 die(_("pathspec '%s' did not match any files"), pathspec[i]);
190 free(seen);
194 * Normalizes argv relative to prefix, via get_pathspec(), and then
195 * runs die_if_path_beyond_symlink() on each path in the normalized
196 * list.
198 static const char **validate_pathspec(const char **argv, const char *prefix)
200 const char **pathspec = get_pathspec(prefix, argv);
202 if (pathspec) {
203 const char **p;
204 for (p = pathspec; *p; p++) {
205 die_if_path_beyond_symlink(*p, prefix);
209 return pathspec;
212 int run_add_interactive(const char *revision, const char *patch_mode,
213 const char **pathspec)
215 int status, ac, pc = 0;
216 const char **args;
218 if (pathspec)
219 while (pathspec[pc])
220 pc++;
222 args = xcalloc(sizeof(const char *), (pc + 5));
223 ac = 0;
224 args[ac++] = "add--interactive";
225 if (patch_mode)
226 args[ac++] = patch_mode;
227 if (revision)
228 args[ac++] = revision;
229 args[ac++] = "--";
230 if (pc) {
231 memcpy(&(args[ac]), pathspec, sizeof(const char *) * pc);
232 ac += pc;
234 args[ac] = NULL;
236 status = run_command_v_opt(args, RUN_GIT_CMD);
237 free(args);
238 return status;
241 int interactive_add(int argc, const char **argv, const char *prefix, int patch)
243 const char **pathspec = NULL;
245 if (argc) {
246 pathspec = validate_pathspec(argv, prefix);
247 if (!pathspec)
248 return -1;
251 return run_add_interactive(NULL,
252 patch ? "--patch" : NULL,
253 pathspec);
256 static int edit_patch(int argc, const char **argv, const char *prefix)
258 char *file = git_pathdup("ADD_EDIT.patch");
259 const char *apply_argv[] = { "apply", "--recount", "--cached",
260 NULL, NULL };
261 struct child_process child;
262 struct rev_info rev;
263 int out;
264 struct stat st;
266 apply_argv[3] = file;
268 git_config(git_diff_basic_config, NULL); /* no "diff" UI options */
270 if (read_cache() < 0)
271 die (_("Could not read the index"));
273 init_revisions(&rev, prefix);
274 rev.diffopt.context = 7;
276 argc = setup_revisions(argc, argv, &rev, NULL);
277 rev.diffopt.output_format = DIFF_FORMAT_PATCH;
278 DIFF_OPT_SET(&rev.diffopt, IGNORE_DIRTY_SUBMODULES);
279 out = open(file, O_CREAT | O_WRONLY, 0666);
280 if (out < 0)
281 die (_("Could not open '%s' for writing."), file);
282 rev.diffopt.file = xfdopen(out, "w");
283 rev.diffopt.close_file = 1;
284 if (run_diff_files(&rev, 0))
285 die (_("Could not write patch"));
287 launch_editor(file, NULL, NULL);
289 if (stat(file, &st))
290 die_errno(_("Could not stat '%s'"), file);
291 if (!st.st_size)
292 die(_("Empty patch. Aborted."));
294 memset(&child, 0, sizeof(child));
295 child.git_cmd = 1;
296 child.argv = apply_argv;
297 if (run_command(&child))
298 die (_("Could not apply '%s'"), file);
300 unlink(file);
301 free(file);
302 return 0;
305 static struct lock_file lock_file;
307 static const char ignore_error[] =
308 N_("The following paths are ignored by one of your .gitignore files:\n");
310 static int verbose = 0, show_only = 0, ignored_too = 0, refresh_only = 0;
311 static int ignore_add_errors, addremove, intent_to_add, ignore_missing = 0;
313 static struct option builtin_add_options[] = {
314 OPT__DRY_RUN(&show_only, N_("dry run")),
315 OPT__VERBOSE(&verbose, N_("be verbose")),
316 OPT_GROUP(""),
317 OPT_BOOLEAN('i', "interactive", &add_interactive, N_("interactive picking")),
318 OPT_BOOLEAN('p', "patch", &patch_interactive, N_("select hunks interactively")),
319 OPT_BOOLEAN('e', "edit", &edit_interactive, N_("edit current diff and apply")),
320 OPT__FORCE(&ignored_too, N_("allow adding otherwise ignored files")),
321 OPT_BOOLEAN('u', "update", &take_worktree_changes, N_("update tracked files")),
322 OPT_BOOLEAN('N', "intent-to-add", &intent_to_add, N_("record only the fact that the path will be added later")),
323 OPT_BOOLEAN('A', "all", &addremove, N_("add changes from all tracked and untracked files")),
324 OPT_BOOLEAN( 0 , "refresh", &refresh_only, N_("don't add, only refresh the index")),
325 OPT_BOOLEAN( 0 , "ignore-errors", &ignore_add_errors, N_("just skip files which cannot be added because of errors")),
326 OPT_BOOLEAN( 0 , "ignore-missing", &ignore_missing, N_("check if - even missing - files are ignored in dry run")),
327 OPT_END(),
330 static int add_config(const char *var, const char *value, void *cb)
332 if (!strcmp(var, "add.ignoreerrors") ||
333 !strcmp(var, "add.ignore-errors")) {
334 ignore_add_errors = git_config_bool(var, value);
335 return 0;
337 return git_default_config(var, value, cb);
340 static int add_files(struct dir_struct *dir, int flags)
342 int i, exit_status = 0;
344 if (dir->ignored_nr) {
345 fprintf(stderr, _(ignore_error));
346 for (i = 0; i < dir->ignored_nr; i++)
347 fprintf(stderr, "%s\n", dir->ignored[i]->name);
348 fprintf(stderr, _("Use -f if you really want to add them.\n"));
349 die(_("no files added"));
352 for (i = 0; i < dir->nr; i++)
353 if (add_file_to_cache(dir->entries[i]->name, flags)) {
354 if (!ignore_add_errors)
355 die(_("adding files failed"));
356 exit_status = 1;
358 return exit_status;
361 int cmd_add(int argc, const char **argv, const char *prefix)
363 int exit_status = 0;
364 int newfd;
365 const char **pathspec;
366 struct dir_struct dir;
367 int flags;
368 int add_new_files;
369 int require_pathspec;
370 char *seen = NULL;
372 git_config(add_config, NULL);
374 argc = parse_options(argc, argv, prefix, builtin_add_options,
375 builtin_add_usage, PARSE_OPT_KEEP_ARGV0);
376 if (patch_interactive)
377 add_interactive = 1;
378 if (add_interactive)
379 exit(interactive_add(argc - 1, argv + 1, prefix, patch_interactive));
381 if (edit_interactive)
382 return(edit_patch(argc, argv, prefix));
383 argc--;
384 argv++;
386 if (addremove && take_worktree_changes)
387 die(_("-A and -u are mutually incompatible"));
388 if (!show_only && ignore_missing)
389 die(_("Option --ignore-missing can only be used together with --dry-run"));
390 if (addremove) {
391 option_with_implicit_dot = "--all";
392 short_option_with_implicit_dot = "-A";
394 if (take_worktree_changes) {
395 option_with_implicit_dot = "--update";
396 short_option_with_implicit_dot = "-u";
398 if (option_with_implicit_dot && !argc) {
399 static const char *here[2] = { ".", NULL };
400 if (prefix)
401 warn_pathless_add();
402 argc = 1;
403 argv = here;
406 add_new_files = !take_worktree_changes && !refresh_only;
407 require_pathspec = !take_worktree_changes;
409 newfd = hold_locked_index(&lock_file, 1);
411 flags = ((verbose ? ADD_CACHE_VERBOSE : 0) |
412 (show_only ? ADD_CACHE_PRETEND : 0) |
413 (intent_to_add ? ADD_CACHE_INTENT : 0) |
414 (ignore_add_errors ? ADD_CACHE_IGNORE_ERRORS : 0) |
415 (!(addremove || take_worktree_changes)
416 ? ADD_CACHE_IGNORE_REMOVAL : 0));
418 if (require_pathspec && argc == 0) {
419 fprintf(stderr, _("Nothing specified, nothing added.\n"));
420 fprintf(stderr, _("Maybe you wanted to say 'git add .'?\n"));
421 return 0;
423 pathspec = validate_pathspec(argv, prefix);
425 if (read_cache() < 0)
426 die(_("index file corrupt"));
427 treat_gitlinks(pathspec);
429 if (add_new_files) {
430 int baselen;
432 /* Set up the default git porcelain excludes */
433 memset(&dir, 0, sizeof(dir));
434 if (!ignored_too) {
435 dir.flags |= DIR_COLLECT_IGNORED;
436 setup_standard_excludes(&dir);
439 /* This picks up the paths that are not tracked */
440 baselen = fill_directory(&dir, pathspec);
441 if (pathspec)
442 seen = prune_directory(&dir, pathspec, baselen);
445 if (refresh_only) {
446 refresh(verbose, pathspec);
447 goto finish;
450 if (pathspec) {
451 int i;
452 struct path_exclude_check check;
454 path_exclude_check_init(&check, &dir);
455 if (!seen)
456 seen = find_pathspecs_matching_against_index(pathspec);
457 for (i = 0; pathspec[i]; i++) {
458 if (!seen[i] && pathspec[i][0]
459 && !file_exists(pathspec[i])) {
460 if (ignore_missing) {
461 int dtype = DT_UNKNOWN;
462 if (is_path_excluded(&check, pathspec[i], -1, &dtype))
463 dir_add_ignored(&dir, pathspec[i], strlen(pathspec[i]));
464 } else
465 die(_("pathspec '%s' did not match any files"),
466 pathspec[i]);
469 free(seen);
470 path_exclude_check_clear(&check);
473 plug_bulk_checkin();
475 exit_status |= add_files_to_cache(prefix, pathspec, flags);
477 if (add_new_files)
478 exit_status |= add_files(&dir, flags);
480 unplug_bulk_checkin();
482 finish:
483 if (active_cache_changed) {
484 if (write_cache(newfd, active_cache, active_nr) ||
485 commit_locked_index(&lock_file))
486 die(_("Unable to write new index file"));
489 return exit_status;