summaryrefslogtreecommitdiff
path: root/sparse-index.h
diff options
context:
space:
mode:
authorDerrick Stolee <dstolee@microsoft.com>2021-03-30 13:10:55 (GMT)
committerJunio C Hamano <gitster@pobox.com>2021-03-30 19:57:47 (GMT)
commit6e773527b6b03976cefbb0f9571bd40dd5995e6c (patch)
tree529b8c4ed147a7b63b08091c20fd37c1173ec152 /sparse-index.h
parentcd42415fb4c9680f308ebf8f9f85ba90ae6014be (diff)
downloadgit-6e773527b6b03976cefbb0f9571bd40dd5995e6c.zip
git-6e773527b6b03976cefbb0f9571bd40dd5995e6c.tar.gz
git-6e773527b6b03976cefbb0f9571bd40dd5995e6c.tar.bz2
sparse-index: convert from full to sparse
If we have a full index, then we can convert it to a sparse index by replacing directories outside of the sparse cone with sparse directory entries. The convert_to_sparse() method does this, when the situation is appropriate. For now, we avoid converting the index to a sparse index if: 1. the index is split. 2. the index is already sparse. 3. sparse-checkout is disabled. 4. sparse-checkout does not use cone mode. Finally, we currently limit the conversion to when the GIT_TEST_SPARSE_INDEX environment variable is enabled. A mode using Git config will be added in a later change. The trickiest thing about this conversion is that we might not be able to mark a directory as a sparse directory just because it is outside the sparse cone. There might be unmerged files within that directory, so we need to look for those. Also, if there is some strange reason why a file is not marked with CE_SKIP_WORKTREE, then we should give up on converting that directory. There is still hope that some of its subdirectories might be able to convert to sparse, so we keep looking deeper. The conversion process is assisted by the cache-tree extension. This is calculated from the full index if it does not already exist. We then abandon the cache-tree as it no longer applies to the newly-sparse index. Thus, this cache-tree will be recalculated in every sparse-full-sparse round-trip until we integrate the cache-tree extension with the sparse index. Some Git commands use the index after writing it. For example, 'git add' will update the index, then write it to disk, then read its entries to report information. To keep the in-memory index in a full state after writing, we re-expand it to a full one after the write. This is wasteful for commands that only write the index and do not read from it again, but that is only the case until we make those commands "sparse aware." We can compare the behavior of the sparse-index in t1092-sparse-checkout-compability.sh by using GIT_TEST_SPARSE_INDEX=1 when operating on the 'sparse-index' repo. We can also compare the two sparse repos directly, such as comparing their indexes (when expanded to full in the case of the 'sparse-index' repo). We also verify that the index is actually populated with sparse directory entries. The 'checkout and reset (mixed)' test is marked for failure when comparing a sparse repo to a full repo, but we can compare the two sparse-checkout cases directly to ensure that we are not changing the behavior when using a sparse index. Signed-off-by: Derrick Stolee <dstolee@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'sparse-index.h')
-rw-r--r--sparse-index.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/sparse-index.h b/sparse-index.h
index 09a20d0..64380e1 100644
--- a/sparse-index.h
+++ b/sparse-index.h
@@ -3,5 +3,6 @@
struct index_state;
void ensure_full_index(struct index_state *istate);
+int convert_to_sparse(struct index_state *istate);
#endif