The sparse index allows storing directory entries in the index, marked with the skip-wortkree bit and pointing to a tree object. This may be an unexpected data shape for some implementation areas, so we are rolling it out incrementally on a builtin-per-builtin basis. This change enables the sparse index for 'git apply'. The main motivation for this change is that 'git apply' is used as a child process of 'git add -p' and expanding the sparse index for each of those child processes can lead to significant performance issues. The good news is that the actual index manipulation code used by 'git apply' is already integrated with the sparse index, so the only product change is to mark the builtin as allowing the sparse index so it isn't inflated on read. The more involved part of this change is around adding tests that verify how 'git apply' behaves in a sparse-checkout environment and whether or not the index expands in certain operations. Signed-off-by: Derrick Stolee <stolee@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
52 lines
1.1 KiB
C
52 lines
1.1 KiB
C
#define USE_THE_REPOSITORY_VARIABLE
|
|
#include "builtin.h"
|
|
#include "gettext.h"
|
|
#include "hash.h"
|
|
#include "apply.h"
|
|
|
|
static const char * const apply_usage[] = {
|
|
N_("git apply [<options>] [<patch>...]"),
|
|
NULL
|
|
};
|
|
|
|
int cmd_apply(int argc,
|
|
const char **argv,
|
|
const char *prefix,
|
|
struct repository *repo)
|
|
{
|
|
int force_apply = 0;
|
|
int options = 0;
|
|
int ret;
|
|
struct apply_state state;
|
|
|
|
if (init_apply_state(&state, the_repository, prefix))
|
|
exit(128);
|
|
|
|
/*
|
|
* We could to redo the "apply.c" machinery to make this
|
|
* arbitrary fallback unnecessary, but it is dubious that it
|
|
* is worth the effort.
|
|
* cf. https://lore.kernel.org/git/xmqqcypfcmn4.fsf@gitster.g/
|
|
*/
|
|
if (!the_hash_algo)
|
|
repo_set_hash_algo(the_repository, GIT_HASH_SHA1);
|
|
|
|
argc = apply_parse_options(argc, argv,
|
|
&state, &force_apply, &options,
|
|
apply_usage);
|
|
|
|
if (repo) {
|
|
prepare_repo_settings(repo);
|
|
repo->settings.command_requires_full_index = 0;
|
|
}
|
|
|
|
if (check_apply_state(&state, force_apply))
|
|
exit(128);
|
|
|
|
ret = apply_all_patches(&state, argc, argv, options);
|
|
|
|
clear_apply_state(&state);
|
|
|
|
return ret;
|
|
}
|