|
|
|
@ -79,12 +79,18 @@ static void fill_directory(struct dir_struct *dir, const char **pathspec,
@@ -79,12 +79,18 @@ static void fill_directory(struct dir_struct *dir, const char **pathspec,
|
|
|
|
|
prune_directory(dir, pathspec, baselen); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
struct update_callback_data |
|
|
|
|
{ |
|
|
|
|
int flags; |
|
|
|
|
int add_errors; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static void update_callback(struct diff_queue_struct *q, |
|
|
|
|
struct diff_options *opt, void *cbdata) |
|
|
|
|
{ |
|
|
|
|
int i, verbose; |
|
|
|
|
int i; |
|
|
|
|
struct update_callback_data *data = cbdata; |
|
|
|
|
|
|
|
|
|
verbose = *((int *)cbdata); |
|
|
|
|
for (i = 0; i < q->nr; i++) { |
|
|
|
|
struct diff_filepair *p = q->queue[i]; |
|
|
|
|
const char *path = p->one->path; |
|
|
|
@ -94,28 +100,35 @@ static void update_callback(struct diff_queue_struct *q,
@@ -94,28 +100,35 @@ static void update_callback(struct diff_queue_struct *q,
|
|
|
|
|
case DIFF_STATUS_UNMERGED: |
|
|
|
|
case DIFF_STATUS_MODIFIED: |
|
|
|
|
case DIFF_STATUS_TYPE_CHANGED: |
|
|
|
|
if (add_file_to_cache(path, verbose)) |
|
|
|
|
die("updating files failed"); |
|
|
|
|
if (add_file_to_cache(path, data->flags & ADD_FILES_VERBOSE)) { |
|
|
|
|
if (!(data->flags & ADD_FILES_IGNORE_ERRORS)) |
|
|
|
|
die("updating files failed"); |
|
|
|
|
data->add_errors++; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case DIFF_STATUS_DELETED: |
|
|
|
|
remove_file_from_cache(path); |
|
|
|
|
if (verbose) |
|
|
|
|
if (data->flags & ADD_FILES_VERBOSE) |
|
|
|
|
printf("remove '%s'\n", path); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void add_files_to_cache(int verbose, const char *prefix, const char **pathspec) |
|
|
|
|
int add_files_to_cache(const char *prefix, const char **pathspec, int flags) |
|
|
|
|
{ |
|
|
|
|
struct update_callback_data data; |
|
|
|
|
struct rev_info rev; |
|
|
|
|
init_revisions(&rev, prefix); |
|
|
|
|
setup_revisions(0, NULL, &rev, NULL); |
|
|
|
|
rev.prune_data = pathspec; |
|
|
|
|
rev.diffopt.output_format = DIFF_FORMAT_CALLBACK; |
|
|
|
|
rev.diffopt.format_callback = update_callback; |
|
|
|
|
rev.diffopt.format_callback_data = &verbose; |
|
|
|
|
data.flags = flags; |
|
|
|
|
data.add_errors = 0; |
|
|
|
|
rev.diffopt.format_callback_data = &data; |
|
|
|
|
run_diff_files(&rev, DIFF_RACY_IS_MODIFIED); |
|
|
|
|
return !!data.add_errors; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void refresh(int verbose, const char **pathspec) |
|
|
|
@ -193,6 +206,7 @@ static struct option builtin_add_options[] = {
@@ -193,6 +206,7 @@ static struct option builtin_add_options[] = {
|
|
|
|
|
|
|
|
|
|
int cmd_add(int argc, const char **argv, const char *prefix) |
|
|
|
|
{ |
|
|
|
|
int exit_status = 0; |
|
|
|
|
int i, newfd; |
|
|
|
|
const char **pathspec; |
|
|
|
|
struct dir_struct dir; |
|
|
|
@ -209,11 +223,16 @@ int cmd_add(int argc, const char **argv, const char *prefix)
@@ -209,11 +223,16 @@ int cmd_add(int argc, const char **argv, const char *prefix)
|
|
|
|
|
newfd = hold_locked_index(&lock_file, 1); |
|
|
|
|
|
|
|
|
|
if (take_worktree_changes) { |
|
|
|
|
int flags = 0; |
|
|
|
|
const char **pathspec; |
|
|
|
|
if (read_cache() < 0) |
|
|
|
|
die("index file corrupt"); |
|
|
|
|
pathspec = get_pathspec(prefix, argv); |
|
|
|
|
add_files_to_cache(verbose, prefix, pathspec); |
|
|
|
|
|
|
|
|
|
if (verbose) |
|
|
|
|
flags |= ADD_FILES_VERBOSE; |
|
|
|
|
|
|
|
|
|
exit_status = add_files_to_cache(prefix, pathspec, flags); |
|
|
|
|
goto finish; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -265,5 +284,5 @@ int cmd_add(int argc, const char **argv, const char *prefix)
@@ -265,5 +284,5 @@ int cmd_add(int argc, const char **argv, const char *prefix)
|
|
|
|
|
die("Unable to write new index file"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
return exit_status; |
|
|
|
|
} |
|
|
|
|