Browse Source

sparse-index: add index.sparse config option

When enabled, this config option signals that index writes should
attempt to use sparse-directory entries.

Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Derrick Stolee 4 years ago committed by Junio C Hamano
parent
commit
58300f4743
  1. 5
      Documentation/config/index.txt
  2. 1
      cache.h
  3. 7
      repo-settings.c
  4. 3
      repository.h
  5. 34
      sparse-index.c

5
Documentation/config/index.txt

@ -14,6 +14,11 @@ index.recordOffsetTable:: @@ -14,6 +14,11 @@ index.recordOffsetTable::
Defaults to 'true' if index.threads has been explicitly enabled,
'false' otherwise.

index.sparse::
When enabled, write the index using sparse-directory entries. This
has no effect unless `core.sparseCheckout` and
`core.sparseCheckoutCone` are both enabled. Defaults to 'false'.

index.threads::
Specifies the number of threads to spawn when loading the index.
This is meant to reduce index load time on multiprocessor machines.

1
cache.h

@ -1059,6 +1059,7 @@ struct repository_format { @@ -1059,6 +1059,7 @@ struct repository_format {
int worktree_config;
int is_bare;
int hash_algo;
int sparse_index;
char *work_tree;
struct string_list unknown_extensions;
struct string_list v1_only_extensions;

7
repo-settings.c

@ -85,4 +85,11 @@ void prepare_repo_settings(struct repository *r) @@ -85,4 +85,11 @@ void prepare_repo_settings(struct repository *r)
* removed.
*/
r->settings.command_requires_full_index = 1;

/*
* Initialize this as off.
*/
r->settings.sparse_index = 0;
if (!repo_config_get_bool(r, "index.sparse", &value) && value)
r->settings.sparse_index = 1;
}

3
repository.h

@ -42,7 +42,8 @@ struct repo_settings { @@ -42,7 +42,8 @@ struct repo_settings {

int core_multi_pack_index;

unsigned command_requires_full_index:1;
unsigned command_requires_full_index:1,
sparse_index:1;
};

struct repository {

34
sparse-index.c

@ -102,19 +102,43 @@ static int convert_to_sparse_rec(struct index_state *istate, @@ -102,19 +102,43 @@ static int convert_to_sparse_rec(struct index_state *istate,
return num_converted - start_converted;
}

static int enable_sparse_index(struct repository *repo)
{
const char *config_path = repo_git_path(repo, "config.worktree");

git_config_set_in_file_gently(config_path,
"index.sparse",
"true");

prepare_repo_settings(repo);
repo->settings.sparse_index = 1;
return 0;
}

int convert_to_sparse(struct index_state *istate)
{
if (istate->split_index || istate->sparse_index ||
!core_apply_sparse_checkout || !core_sparse_checkout_cone)
return 0;

if (!istate->repo)
istate->repo = the_repository;

/*
* The GIT_TEST_SPARSE_INDEX environment variable triggers the
* index.sparse config variable to be on.
*/
if (git_env_bool("GIT_TEST_SPARSE_INDEX", 0)) {
int err = enable_sparse_index(istate->repo);
if (err < 0)
return err;
}

/*
* For now, only create a sparse index with the
* GIT_TEST_SPARSE_INDEX environment variable. We will relax
* this once we have a proper way to opt-in (and later still,
* opt-out).
* Only convert to sparse if index.sparse is set.
*/
if (!git_env_bool("GIT_TEST_SPARSE_INDEX", 0))
prepare_repo_settings(istate->repo);
if (!istate->repo->settings.sparse_index)
return 0;

if (!istate->sparse_checkout_patterns) {

Loading…
Cancel
Save