Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.kernel.org/pub/scm/git/git.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerrick Stolee <dstolee@microsoft.com>2021-03-30 16:10:59 +0300
committerJunio C Hamano <gitster@pobox.com>2021-03-30 22:57:47 +0300
commit58300f4743231724686d9ddf481aeefa4f90d2f7 (patch)
tree0a73a7f7312d021f7891107d27f2ac0161e62202
parent0938e6ff552510d4e6e495f062a9fab3e932178a (diff)
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>
-rw-r--r--Documentation/config/index.txt5
-rw-r--r--cache.h1
-rw-r--r--repo-settings.c7
-rw-r--r--repository.h3
-rw-r--r--sparse-index.c34
5 files changed, 44 insertions, 6 deletions
diff --git a/Documentation/config/index.txt b/Documentation/config/index.txt
index 7cb50b37e9..75f3a2d105 100644
--- a/Documentation/config/index.txt
+++ b/Documentation/config/index.txt
@@ -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.
diff --git a/cache.h b/cache.h
index 74b43aaa2b..8aede373ae 100644
--- a/cache.h
+++ b/cache.h
@@ -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;
diff --git a/repo-settings.c b/repo-settings.c
index d63569e404..0cfe8b787d 100644
--- a/repo-settings.c
+++ b/repo-settings.c
@@ -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;
}
diff --git a/repository.h b/repository.h
index e06a230156..a45f7520fd 100644
--- a/repository.h
+++ b/repository.h
@@ -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 {
diff --git a/sparse-index.c b/sparse-index.c
index 7631f7bd00..6f4d95d35b 100644
--- a/sparse-index.c
+++ b/sparse-index.c
@@ -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) {