read-cache: move shared add/checkout/commit code
The function add_files_to_cache(), plus associated helper functions, were defined in builtin/add.c, but also shared with builtin/checkout.c and builtin/commit.c. Move these shared functions to read-cache.c. Diff best viewed with `--color-moved`. Signed-off-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
50c37ee839
commit
6cee5ebc7a
100
builtin/add.c
100
builtin/add.c
|
@ -36,13 +36,6 @@ static int pathspec_file_nul;
|
|||
static int include_sparse;
|
||||
static const char *pathspec_from_file;
|
||||
|
||||
struct update_callback_data {
|
||||
struct index_state *index;
|
||||
int include_sparse;
|
||||
int flags;
|
||||
int add_errors;
|
||||
};
|
||||
|
||||
static int chmod_pathspec(struct pathspec *pathspec, char flip, int show_only)
|
||||
{
|
||||
int i, ret = 0;
|
||||
|
@ -71,99 +64,6 @@ static int chmod_pathspec(struct pathspec *pathspec, char flip, int show_only)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int fix_unmerged_status(struct diff_filepair *p,
|
||||
struct update_callback_data *data)
|
||||
{
|
||||
if (p->status != DIFF_STATUS_UNMERGED)
|
||||
return p->status;
|
||||
if (!(data->flags & ADD_CACHE_IGNORE_REMOVAL) && !p->two->mode)
|
||||
/*
|
||||
* This is not an explicit add request, and the
|
||||
* path is missing from the working tree (deleted)
|
||||
*/
|
||||
return DIFF_STATUS_DELETED;
|
||||
else
|
||||
/*
|
||||
* Either an explicit add request, or path exists
|
||||
* in the working tree. An attempt to explicitly
|
||||
* add a path that does not exist in the working tree
|
||||
* will be caught as an error by the caller immediately.
|
||||
*/
|
||||
return DIFF_STATUS_MODIFIED;
|
||||
}
|
||||
|
||||
static void update_callback(struct diff_queue_struct *q,
|
||||
struct diff_options *opt UNUSED, 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;
|
||||
|
||||
if (!data->include_sparse &&
|
||||
!path_in_sparse_checkout(path, data->index))
|
||||
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(data->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(data->index, path);
|
||||
if (data->flags & (ADD_CACHE_PRETEND|ADD_CACHE_VERBOSE))
|
||||
printf(_("remove '%s'\n"), path);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int add_files_to_cache(struct repository *repo, const char *prefix,
|
||||
const struct pathspec *pathspec, int include_sparse,
|
||||
int flags)
|
||||
{
|
||||
struct update_callback_data data;
|
||||
struct rev_info rev;
|
||||
|
||||
memset(&data, 0, sizeof(data));
|
||||
data.index = repo->index;
|
||||
data.include_sparse = include_sparse;
|
||||
data.flags = flags;
|
||||
|
||||
repo_init_revisions(repo, &rev, prefix);
|
||||
setup_revisions(0, NULL, &rev, NULL);
|
||||
if (pathspec)
|
||||
copy_pathspec(&rev.prune_data, pathspec);
|
||||
rev.diffopt.output_format = DIFF_FORMAT_CALLBACK;
|
||||
rev.diffopt.format_callback = update_callback;
|
||||
rev.diffopt.format_callback_data = &data;
|
||||
rev.diffopt.flags.override_submodule_config = 1;
|
||||
rev.max_count = 0; /* do not compare unmerged paths with stage #2 */
|
||||
|
||||
/*
|
||||
* Use an ODB transaction to optimize adding multiple objects.
|
||||
* This function is invoked from commands other than 'add', which
|
||||
* may not have their own transaction active.
|
||||
*/
|
||||
begin_odb_transaction();
|
||||
run_diff_files(&rev, DIFF_RACY_IS_MODIFIED);
|
||||
end_odb_transaction();
|
||||
|
||||
release_revisions(&rev);
|
||||
return !!data.add_errors;
|
||||
}
|
||||
|
||||
static int renormalize_tracked_files(const struct pathspec *pathspec, int flags)
|
||||
{
|
||||
int i, retval = 0;
|
||||
|
|
102
read-cache.c
102
read-cache.c
|
@ -5,6 +5,7 @@
|
|||
*/
|
||||
#include "cache.h"
|
||||
#include "alloc.h"
|
||||
#include "bulk-checkin.h"
|
||||
#include "config.h"
|
||||
#include "date.h"
|
||||
#include "diff.h"
|
||||
|
@ -26,6 +27,7 @@
|
|||
#include "mem-pool.h"
|
||||
#include "object-name.h"
|
||||
#include "resolve-undo.h"
|
||||
#include "revision.h"
|
||||
#include "run-command.h"
|
||||
#include "strbuf.h"
|
||||
#include "trace2.h"
|
||||
|
@ -3943,3 +3945,103 @@ void overlay_tree_on_index(struct index_state *istate,
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct update_callback_data {
|
||||
struct index_state *index;
|
||||
int include_sparse;
|
||||
int flags;
|
||||
int add_errors;
|
||||
};
|
||||
|
||||
static int fix_unmerged_status(struct diff_filepair *p,
|
||||
struct update_callback_data *data)
|
||||
{
|
||||
if (p->status != DIFF_STATUS_UNMERGED)
|
||||
return p->status;
|
||||
if (!(data->flags & ADD_CACHE_IGNORE_REMOVAL) && !p->two->mode)
|
||||
/*
|
||||
* This is not an explicit add request, and the
|
||||
* path is missing from the working tree (deleted)
|
||||
*/
|
||||
return DIFF_STATUS_DELETED;
|
||||
else
|
||||
/*
|
||||
* Either an explicit add request, or path exists
|
||||
* in the working tree. An attempt to explicitly
|
||||
* add a path that does not exist in the working tree
|
||||
* will be caught as an error by the caller immediately.
|
||||
*/
|
||||
return DIFF_STATUS_MODIFIED;
|
||||
}
|
||||
|
||||
static void update_callback(struct diff_queue_struct *q,
|
||||
struct diff_options *opt UNUSED, 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;
|
||||
|
||||
if (!data->include_sparse &&
|
||||
!path_in_sparse_checkout(path, data->index))
|
||||
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(data->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(data->index, path);
|
||||
if (data->flags & (ADD_CACHE_PRETEND|ADD_CACHE_VERBOSE))
|
||||
printf(_("remove '%s'\n"), path);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int add_files_to_cache(struct repository *repo, const char *prefix,
|
||||
const struct pathspec *pathspec, int include_sparse,
|
||||
int flags)
|
||||
{
|
||||
struct update_callback_data data;
|
||||
struct rev_info rev;
|
||||
|
||||
memset(&data, 0, sizeof(data));
|
||||
data.index = repo->index;
|
||||
data.include_sparse = include_sparse;
|
||||
data.flags = flags;
|
||||
|
||||
repo_init_revisions(repo, &rev, prefix);
|
||||
setup_revisions(0, NULL, &rev, NULL);
|
||||
if (pathspec)
|
||||
copy_pathspec(&rev.prune_data, pathspec);
|
||||
rev.diffopt.output_format = DIFF_FORMAT_CALLBACK;
|
||||
rev.diffopt.format_callback = update_callback;
|
||||
rev.diffopt.format_callback_data = &data;
|
||||
rev.diffopt.flags.override_submodule_config = 1;
|
||||
rev.max_count = 0; /* do not compare unmerged paths with stage #2 */
|
||||
|
||||
/*
|
||||
* Use an ODB transaction to optimize adding multiple objects.
|
||||
* This function is invoked from commands other than 'add', which
|
||||
* may not have their own transaction active.
|
||||
*/
|
||||
begin_odb_transaction();
|
||||
run_diff_files(&rev, DIFF_RACY_IS_MODIFIED);
|
||||
end_odb_transaction();
|
||||
|
||||
release_revisions(&rev);
|
||||
return !!data.add_errors;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue