static void update_callback(struct diff_queue_struct *q, struct diff_options *opt, void *cbdata) { int i; struct update_callback_data *data = cbdata; for (i = 0; i < q->nr; i++) { struct diff_filepair *p = q->queue[i]; const char *path = p->one->path; switch (fix_unmerged_status(p, data)) { default: die(_("unexpected diff status %c"), p->status); case DIFF_STATUS_MODIFIED: case DIFF_STATUS_TYPE_CHANGED: if (add_file_to_index(&the_index, path, data->flags)) { if (!(data->flags & ADD_CACHE_IGNORE_ERRORS)) die(_("updating files failed")); data->add_errors++; } break; case DIFF_STATUS_DELETED: if (data->flags & ADD_CACHE_IGNORE_REMOVAL) break; if (!(data->flags & ADD_CACHE_PRETEND)) remove_file_from_index(&the_index, path); if (data->flags & (ADD_CACHE_PRETEND|ADD_CACHE_VERBOSE)) printf(_("remove '%s'\n"), path); break; } } }
static void update_callback(struct diff_queue_struct *q, struct diff_options *opt, void *cbdata) { int i; struct update_callback_data *data = cbdata; for (i = 0; i < q->nr; i++) { struct diff_filepair *p = q->queue[i]; const char *path = p->one->path; switch (p->status) { default: die("unexpected diff status %c", p->status); case DIFF_STATUS_UNMERGED: /* * ADD_CACHE_IGNORE_REMOVAL is unset if "git * add -u" is calling us, In such a case, a * missing work tree file needs to be removed * if there is an unmerged entry at stage #2, * but such a diff record is followed by * another with DIFF_STATUS_DELETED (and if * there is no stage #2, we won't see DELETED * nor MODIFIED). We can simply continue * either way. */ if (!(data->flags & ADD_CACHE_IGNORE_REMOVAL)) continue; /* * Otherwise, it is "git add path" is asking * to explicitly add it; we fall through. A * missing work tree file is an error and is * caught by add_file_to_index() in such a * case. */ case DIFF_STATUS_MODIFIED: case DIFF_STATUS_TYPE_CHANGED: if (add_file_to_index(&the_index, path, data->flags)) { if (!(data->flags & ADD_CACHE_IGNORE_ERRORS)) die("updating files failed"); data->add_errors++; } break; case DIFF_STATUS_DELETED: if (data->flags & ADD_CACHE_IGNORE_REMOVAL) break; if (!(data->flags & ADD_CACHE_PRETEND)) remove_file_from_index(&the_index, path); if (data->flags & (ADD_CACHE_PRETEND|ADD_CACHE_VERBOSE)) printf("remove '%s'\n", path); break; } } }
static void update_callback(struct diff_queue_struct *q, struct diff_options *opt, void *cbdata) { int i; struct update_callback_data *data = cbdata; const char *implicit_dot = data->implicit_dot; size_t implicit_dot_len = data->implicit_dot_len; for (i = 0; i < q->nr; i++) { struct diff_filepair *p = q->queue[i]; const char *path = p->one->path; /* * Check if "git add -A" or "git add -u" was run from a * subdirectory with a modified file outside that directory, * and warn if so. * * "git add -u" will behave like "git add -u :/" instead of * "git add -u ." in the future. This warning prepares for * that change. */ if (implicit_dot && strncmp_icase(path, implicit_dot, implicit_dot_len)) { warn_pathless_add(); continue; } switch (fix_unmerged_status(p, data)) { default: die(_("unexpected diff status %c"), p->status); case DIFF_STATUS_MODIFIED: case DIFF_STATUS_TYPE_CHANGED: if (add_file_to_index(&the_index, path, data->flags)) { if (!(data->flags & ADD_CACHE_IGNORE_ERRORS)) die(_("updating files failed")); data->add_errors++; } break; case DIFF_STATUS_DELETED: if (data->warn_add_would_remove) { warn_add_would_remove(path); data->warn_add_would_remove = 0; } if (data->flags & ADD_CACHE_IGNORE_REMOVAL) break; if (!(data->flags & ADD_CACHE_PRETEND)) remove_file_from_index(&the_index, path); if (data->flags & (ADD_CACHE_PRETEND|ADD_CACHE_VERBOSE)) printf(_("remove '%s'\n"), path); break; } } }
static int remove_file(struct merge_options *o, int clean, const char *path, int no_wd, unsigned int ctime, unsigned int mtime) { int update_cache = o->call_depth || clean; int update_working_directory = !o->call_depth && !no_wd; if (o->collect_blocks_only) return 0; if (update_cache) { if (remove_file_from_index(o->index, path)) return -1; } if (update_working_directory) { if (remove_path(o->worktree, path, ctime, mtime)) return -1; } return 0; }