git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: "Derrick Stolee via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: newren@gmail.com, gitster@pobox.com, pclouds@gmail.com,
	jrnieder@gmail.com, "Martin Ågren" <martin.agren@gmail.com>,
	"Derrick Stolee" <stolee@gmail.com>,
	"SZEDER Gábor" <szeder.dev@gmail.com>,
	"Ævar Arnfjörð Bjarmason" <avarab@gmail.com>,
	"Derrick Stolee" <derrickstolee@github.com>,
	"Derrick Stolee" <dstolee@microsoft.com>
Subject: [PATCH v3 11/20] sparse-index: convert from full to sparse
Date: Tue, 16 Mar 2021 16:42:54 +0000	[thread overview]
Message-ID: <e41b14e03ebb143c874cc276adcbc36059f0c64e.1615912983.git.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.883.v3.git.1615912983.gitgitgadget@gmail.com>

From: Derrick Stolee <dstolee@microsoft.com>

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>
---
 cache-tree.c                             |   3 +
 cache.h                                  |   2 +
 read-cache.c                             |  26 ++++-
 sparse-index.c                           | 139 +++++++++++++++++++++++
 sparse-index.h                           |   1 +
 t/t1092-sparse-checkout-compatibility.sh |  61 +++++++++-
 6 files changed, 228 insertions(+), 4 deletions(-)

diff --git a/cache-tree.c b/cache-tree.c
index 2fb483d3c083..5f07a39e501e 100644
--- a/cache-tree.c
+++ b/cache-tree.c
@@ -6,6 +6,7 @@
 #include "object-store.h"
 #include "replace-object.h"
 #include "promisor-remote.h"
+#include "sparse-index.h"
 
 #ifndef DEBUG_CACHE_TREE
 #define DEBUG_CACHE_TREE 0
@@ -442,6 +443,8 @@ int cache_tree_update(struct index_state *istate, int flags)
 	if (i)
 		return i;
 
+	ensure_full_index(istate);
+
 	if (!istate->cache_tree)
 		istate->cache_tree = cache_tree();
 
diff --git a/cache.h b/cache.h
index 759ca92e2ecc..69a32146cd77 100644
--- a/cache.h
+++ b/cache.h
@@ -251,6 +251,8 @@ static inline unsigned int create_ce_mode(unsigned int mode)
 {
 	if (S_ISLNK(mode))
 		return S_IFLNK;
+	if (mode == S_IFDIR)
+		return S_IFDIR;
 	if (S_ISDIR(mode) || S_ISGITLINK(mode))
 		return S_IFGITLINK;
 	return S_IFREG | ce_permissions(mode);
diff --git a/read-cache.c b/read-cache.c
index dd3980c12b53..b9c08773466c 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -25,6 +25,7 @@
 #include "fsmonitor.h"
 #include "thread-utils.h"
 #include "progress.h"
+#include "sparse-index.h"
 
 /* Mask for the name length in ce_flags in the on-disk index */
 
@@ -1002,8 +1003,14 @@ int verify_path(const char *path, unsigned mode)
 
 			c = *path++;
 			if ((c == '.' && !verify_dotfile(path, mode)) ||
-			    is_dir_sep(c) || c == '\0')
+			    is_dir_sep(c))
 				return 0;
+			/*
+			 * allow terminating directory separators for
+			 * sparse directory entries.
+			 */
+			if (c == '\0')
+				return S_ISDIR(mode);
 		} else if (c == '\\' && protect_ntfs) {
 			if (is_ntfs_dotgit(path))
 				return 0;
@@ -3079,6 +3086,14 @@ static int do_write_locked_index(struct index_state *istate, struct lock_file *l
 				 unsigned flags)
 {
 	int ret;
+	int was_full = !istate->sparse_index;
+
+	ret = convert_to_sparse(istate);
+
+	if (ret) {
+		warning(_("failed to convert to a sparse-index"));
+		return ret;
+	}
 
 	/*
 	 * TODO trace2: replace "the_repository" with the actual repo instance
@@ -3090,6 +3105,9 @@ static int do_write_locked_index(struct index_state *istate, struct lock_file *l
 	trace2_region_leave_printf("index", "do_write_index", the_repository,
 				   "%s", get_lock_file_path(lock));
 
+	if (was_full)
+		ensure_full_index(istate);
+
 	if (ret)
 		return ret;
 	if (flags & COMMIT_LOCK)
@@ -3180,9 +3198,10 @@ static int write_shared_index(struct index_state *istate,
 			      struct tempfile **temp)
 {
 	struct split_index *si = istate->split_index;
-	int ret;
+	int ret, was_full = !istate->sparse_index;
 
 	move_cache_to_base_index(istate);
+	convert_to_sparse(istate);
 
 	trace2_region_enter_printf("index", "shared/do_write_index",
 				   the_repository, "%s", get_tempfile_path(*temp));
@@ -3190,6 +3209,9 @@ static int write_shared_index(struct index_state *istate,
 	trace2_region_leave_printf("index", "shared/do_write_index",
 				   the_repository, "%s", get_tempfile_path(*temp));
 
+	if (was_full)
+		ensure_full_index(istate);
+
 	if (ret)
 		return ret;
 	ret = adjust_shared_perm(get_tempfile_path(*temp));
diff --git a/sparse-index.c b/sparse-index.c
index 7095378a1b28..619ff7c2e217 100644
--- a/sparse-index.c
+++ b/sparse-index.c
@@ -4,6 +4,145 @@
 #include "tree.h"
 #include "pathspec.h"
 #include "trace2.h"
+#include "cache-tree.h"
+#include "config.h"
+#include "dir.h"
+#include "fsmonitor.h"
+
+static struct cache_entry *construct_sparse_dir_entry(
+				struct index_state *istate,
+				const char *sparse_dir,
+				struct cache_tree *tree)
+{
+	struct cache_entry *de;
+
+	de = make_cache_entry(istate, S_IFDIR, &tree->oid, sparse_dir, 0, 0);
+
+	de->ce_flags |= CE_SKIP_WORKTREE;
+	return de;
+}
+
+/*
+ * Returns the number of entries "inserted" into the index.
+ */
+static int convert_to_sparse_rec(struct index_state *istate,
+				 int num_converted,
+				 int start, int end,
+				 const char *ct_path, size_t ct_pathlen,
+				 struct cache_tree *ct)
+{
+	int i, can_convert = 1;
+	int start_converted = num_converted;
+	enum pattern_match_result match;
+	int dtype;
+	struct strbuf child_path = STRBUF_INIT;
+	struct pattern_list *pl = istate->sparse_checkout_patterns;
+
+	/*
+	 * Is the current path outside of the sparse cone?
+	 * Then check if the region can be replaced by a sparse
+	 * directory entry (everything is sparse and merged).
+	 */
+	match = path_matches_pattern_list(ct_path, ct_pathlen,
+					  NULL, &dtype, pl, istate);
+	if (match != NOT_MATCHED)
+		can_convert = 0;
+
+	for (i = start; can_convert && i < end; i++) {
+		struct cache_entry *ce = istate->cache[i];
+
+		if (ce_stage(ce) ||
+		    !(ce->ce_flags & CE_SKIP_WORKTREE))
+			can_convert = 0;
+	}
+
+	if (can_convert) {
+		struct cache_entry *se;
+		se = construct_sparse_dir_entry(istate, ct_path, ct);
+
+		istate->cache[num_converted++] = se;
+		return 1;
+	}
+
+	for (i = start; i < end; ) {
+		int count, span, pos = -1;
+		const char *base, *slash;
+		struct cache_entry *ce = istate->cache[i];
+
+		/*
+		 * Detect if this is a normal entry outside of any subtree
+		 * entry.
+		 */
+		base = ce->name + ct_pathlen;
+		slash = strchr(base, '/');
+
+		if (slash)
+			pos = cache_tree_subtree_pos(ct, base, slash - base);
+
+		if (pos < 0) {
+			istate->cache[num_converted++] = ce;
+			i++;
+			continue;
+		}
+
+		strbuf_setlen(&child_path, 0);
+		strbuf_add(&child_path, ce->name, slash - ce->name + 1);
+
+		span = ct->down[pos]->cache_tree->entry_count;
+		count = convert_to_sparse_rec(istate,
+					      num_converted, i, i + span,
+					      child_path.buf, child_path.len,
+					      ct->down[pos]->cache_tree);
+		num_converted += count;
+		i += span;
+	}
+
+	strbuf_release(&child_path);
+	return num_converted - start_converted;
+}
+
+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;
+
+	/*
+	 * 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).
+	 */
+	if (!git_env_bool("GIT_TEST_SPARSE_INDEX", 0))
+		return 0;
+
+	if (!istate->sparse_checkout_patterns) {
+		istate->sparse_checkout_patterns = xcalloc(1, sizeof(struct pattern_list));
+		if (get_sparse_checkout_patterns(istate->sparse_checkout_patterns) < 0)
+			return 0;
+	}
+
+	if (!istate->sparse_checkout_patterns->use_cone_patterns) {
+		warning(_("attempting to use sparse-index without cone mode"));
+		return -1;
+	}
+
+	if (cache_tree_update(istate, 0)) {
+		warning(_("unable to update cache-tree, staying full"));
+		return -1;
+	}
+
+	remove_fsmonitor(istate);
+
+	trace2_region_enter("index", "convert_to_sparse", istate->repo);
+	istate->cache_nr = convert_to_sparse_rec(istate,
+						 0, 0, istate->cache_nr,
+						 "", 0, istate->cache_tree);
+	istate->drop_cache_tree = 1;
+	istate->sparse_index = 1;
+	trace2_region_leave("index", "convert_to_sparse", istate->repo);
+	return 0;
+}
 
 static void set_index_entry(struct index_state *istate, int nr, struct cache_entry *ce)
 {
diff --git a/sparse-index.h b/sparse-index.h
index 09a20d036c46..64380e121d80 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
diff --git a/t/t1092-sparse-checkout-compatibility.sh b/t/t1092-sparse-checkout-compatibility.sh
index a1aea141c62c..1e888d195122 100755
--- a/t/t1092-sparse-checkout-compatibility.sh
+++ b/t/t1092-sparse-checkout-compatibility.sh
@@ -2,6 +2,11 @@
 
 test_description='compare full workdir to sparse workdir'
 
+# The verify_cache_tree() check is not sparse-aware (yet).
+# So, disable the check until that integration is complete.
+GIT_TEST_CHECK_CACHE_TREE=0
+GIT_TEST_SPLIT_INDEX=0
+
 . ./test-lib.sh
 
 test_expect_success 'setup' '
@@ -121,7 +126,9 @@ run_on_all () {
 test_all_match () {
 	run_on_all "$@" &&
 	test_cmp full-checkout-out sparse-checkout-out &&
-	test_cmp full-checkout-err sparse-checkout-err
+	test_cmp full-checkout-out sparse-index-out &&
+	test_cmp full-checkout-err sparse-checkout-err &&
+	test_cmp full-checkout-err sparse-index-err
 }
 
 test_sparse_match () {
@@ -130,6 +137,38 @@ test_sparse_match () {
 	test_cmp sparse-checkout-err sparse-index-err
 }
 
+test_expect_success 'sparse-index contents' '
+	init_repos &&
+
+	test-tool -C sparse-index read-cache --table >cache &&
+	for dir in folder1 folder2 x
+	do
+		TREE=$(git -C sparse-index rev-parse HEAD:$dir) &&
+		grep "040000 tree $TREE	$dir/" cache \
+			|| return 1
+	done &&
+
+	GIT_TEST_SPARSE_INDEX=1 git -C sparse-index sparse-checkout set folder1 &&
+
+	test-tool -C sparse-index read-cache --table >cache &&
+	for dir in deep folder2 x
+	do
+		TREE=$(git -C sparse-index rev-parse HEAD:$dir) &&
+		grep "040000 tree $TREE	$dir/" cache \
+			|| return 1
+	done &&
+
+	GIT_TEST_SPARSE_INDEX=1 git -C sparse-index sparse-checkout set deep/deeper1 &&
+
+	test-tool -C sparse-index read-cache --table >cache &&
+	for dir in deep/deeper2 folder1 folder2 x
+	do
+		TREE=$(git -C sparse-index rev-parse HEAD:$dir) &&
+		grep "040000 tree $TREE	$dir/" cache \
+			|| return 1
+	done
+'
+
 test_expect_success 'expanded in-memory index matches full index' '
 	init_repos &&
 	test_sparse_match test-tool read-cache --expand --table
@@ -137,6 +176,7 @@ test_expect_success 'expanded in-memory index matches full index' '
 
 test_expect_success 'status with options' '
 	init_repos &&
+	test_sparse_match ls &&
 	test_all_match git status --porcelain=v2 &&
 	test_all_match git status --porcelain=v2 -z -u &&
 	test_all_match git status --porcelain=v2 -uno &&
@@ -273,6 +313,17 @@ test_expect_failure 'checkout and reset (mixed)' '
 	test_all_match git reset update-folder2
 '
 
+# Ensure that sparse-index behaves identically to
+# sparse-checkout with a full index.
+test_expect_success 'checkout and reset (mixed) [sparse]' '
+	init_repos &&
+
+	test_sparse_match git checkout -b reset-test update-deep &&
+	test_sparse_match git reset deepest &&
+	test_sparse_match git reset update-folder1 &&
+	test_sparse_match git reset update-folder2
+'
+
 test_expect_success 'merge' '
 	init_repos &&
 
@@ -309,14 +360,20 @@ test_expect_success 'clean' '
 	test_all_match git status --porcelain=v2 &&
 	test_all_match git clean -f &&
 	test_all_match git status --porcelain=v2 &&
+	test_sparse_match ls &&
+	test_sparse_match ls folder1 &&
 
 	test_all_match git clean -xf &&
 	test_all_match git status --porcelain=v2 &&
+	test_sparse_match ls &&
+	test_sparse_match ls folder1 &&
 
 	test_all_match git clean -xdf &&
 	test_all_match git status --porcelain=v2 &&
+	test_sparse_match ls &&
+	test_sparse_match ls folder1 &&
 
-	test_path_is_dir sparse-checkout/folder1
+	test_sparse_match test_path_is_dir folder1
 '
 
 test_done
-- 
gitgitgadget


  parent reply	other threads:[~2021-03-16 16:44 UTC|newest]

Thread overview: 203+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-23 20:14 [PATCH 00/20] Sparse Index: Design, Format, Tests Derrick Stolee via GitGitGadget
2021-02-23 20:14 ` [PATCH 01/20] sparse-index: design doc and format update Derrick Stolee via GitGitGadget
2021-02-24  1:13   ` Elijah Newren
2021-02-25 15:29     ` Derrick Stolee
2021-02-25 20:14       ` Elijah Newren
2021-02-23 20:14 ` [PATCH 02/20] t/perf: add performance test for sparse operations Derrick Stolee via GitGitGadget
2021-02-24  2:30   ` Elijah Newren
2021-03-09 20:03     ` Derrick Stolee
2021-02-23 20:14 ` [PATCH 03/20] t1092: clean up script quoting Derrick Stolee via GitGitGadget
2021-02-23 20:14 ` [PATCH 04/20] sparse-index: add guard to ensure full index Derrick Stolee via GitGitGadget
2021-02-24  2:44   ` Elijah Newren
2021-02-23 20:14 ` [PATCH 05/20] sparse-index: implement ensure_full_index() Derrick Stolee via GitGitGadget
2021-02-24  3:20   ` Elijah Newren
2021-02-23 20:14 ` [PATCH 06/20] t1092: compare sparse-checkout to sparse-index Derrick Stolee via GitGitGadget
2021-02-25  6:37   ` Elijah Newren
2021-02-23 20:14 ` [PATCH 07/20] test-read-cache: print cache entries with --table Derrick Stolee via GitGitGadget
2021-02-25  7:02   ` Elijah Newren
2021-03-09 21:00     ` Derrick Stolee
2021-02-23 20:14 ` [PATCH 08/20] test-tool: don't force full index Derrick Stolee via GitGitGadget
2021-02-23 20:14 ` [PATCH 09/20] unpack-trees: ensure " Derrick Stolee via GitGitGadget
2021-02-23 20:14 ` [PATCH 10/20] sparse-checkout: hold pattern list in index Derrick Stolee via GitGitGadget
2021-02-25  7:14   ` Elijah Newren
2021-02-23 20:14 ` [PATCH 11/20] sparse-index: convert from full to sparse Derrick Stolee via GitGitGadget
2021-02-25  7:33   ` Elijah Newren
2021-03-09 21:13     ` Derrick Stolee
2021-02-23 20:14 ` [PATCH 12/20] submodule: sparse-index should not collapse links Derrick Stolee via GitGitGadget
2021-02-23 20:14 ` [PATCH 13/20] unpack-trees: allow sparse directories Derrick Stolee via GitGitGadget
2021-02-25  7:40   ` Elijah Newren
2021-03-09 21:35     ` Derrick Stolee
2021-03-09 21:39       ` Elijah Newren
2021-02-23 20:14 ` [PATCH 14/20] sparse-index: check index conversion happens Derrick Stolee via GitGitGadget
2021-02-23 20:14 ` [PATCH 15/20] sparse-index: create extension for compatibility Derrick Stolee via GitGitGadget
2021-02-25  7:45   ` Elijah Newren
2021-03-09 21:45     ` Derrick Stolee
2021-02-23 20:14 ` [PATCH 16/20] sparse-checkout: toggle sparse index from builtin Derrick Stolee via GitGitGadget
2021-02-24 19:11   ` Martin Ågren
2021-03-09 20:52     ` Derrick Stolee
2021-03-09 21:03       ` Elijah Newren
2021-03-09 21:10         ` Derrick Stolee
2021-03-09 21:38           ` Elijah Newren
2021-03-14 20:08       ` Martin Ågren
2021-03-15 13:36         ` Derrick Stolee
2021-02-23 20:14 ` [PATCH 17/20] sparse-checkout: disable sparse-index Derrick Stolee via GitGitGadget
2021-02-27 12:32   ` SZEDER Gábor
2021-03-09 20:20     ` Derrick Stolee
2021-03-10 18:20       ` Derrick Stolee
2021-02-23 20:14 ` [PATCH 18/20] cache-tree: integrate with sparse directory entries Derrick Stolee via GitGitGadget
2021-02-23 20:14 ` [PATCH 19/20] sparse-index: loose integration with cache_tree_verify() Derrick Stolee via GitGitGadget
2021-02-23 20:14 ` [PATCH 20/20] p2000: add sparse-index repos Derrick Stolee via GitGitGadget
2021-02-23 23:49 ` [PATCH 00/20] Sparse Index: Design, Format, Tests Elijah Newren
2021-02-26 21:28   ` Elijah Newren
2021-03-10 19:30 ` [PATCH v2 " Derrick Stolee via GitGitGadget
2021-03-10 19:30   ` [PATCH v2 01/20] sparse-index: design doc and format update Derrick Stolee via GitGitGadget
2021-03-10 22:19     ` Elijah Newren
2021-03-10 19:30   ` [PATCH v2 02/20] t/perf: add performance test for sparse operations Derrick Stolee via GitGitGadget
2021-03-10 19:30   ` [PATCH v2 03/20] t1092: clean up script quoting Derrick Stolee via GitGitGadget
2021-03-10 19:30   ` [PATCH v2 04/20] sparse-index: add guard to ensure full index Derrick Stolee via GitGitGadget
2021-03-10 19:30   ` [PATCH v2 05/20] sparse-index: implement ensure_full_index() Derrick Stolee via GitGitGadget
2021-03-12  6:50     ` Junio C Hamano
2021-03-12 13:56       ` Derrick Stolee
2021-03-12 20:08         ` Junio C Hamano
2021-03-12 20:11           ` Derrick Stolee
2021-03-15 23:52             ` Ævar Arnfjörð Bjarmason
2021-03-10 19:30   ` [PATCH v2 06/20] t1092: compare sparse-checkout to sparse-index Derrick Stolee via GitGitGadget
2021-03-10 23:04     ` Elijah Newren
2021-03-11 14:17       ` Derrick Stolee
2021-03-10 19:30   ` [PATCH v2 07/20] test-read-cache: print cache entries with --table Derrick Stolee via GitGitGadget
2021-03-10 19:30   ` [PATCH v2 08/20] test-tool: don't force full index Derrick Stolee via GitGitGadget
2021-03-10 19:30   ` [PATCH v2 09/20] unpack-trees: ensure " Derrick Stolee via GitGitGadget
2021-03-10 19:30   ` [PATCH v2 10/20] sparse-checkout: hold pattern list in index Derrick Stolee via GitGitGadget
2021-03-10 19:30   ` [PATCH v2 11/20] sparse-index: convert from full to sparse Derrick Stolee via GitGitGadget
2021-03-10 23:44     ` Elijah Newren
2021-03-11 14:13       ` Derrick Stolee
2021-03-10 19:30   ` [PATCH v2 12/20] submodule: sparse-index should not collapse links Derrick Stolee via GitGitGadget
2021-03-10 19:30   ` [PATCH v2 13/20] unpack-trees: allow sparse directories Derrick Stolee via GitGitGadget
2021-03-10 19:30   ` [PATCH v2 14/20] sparse-index: check index conversion happens Derrick Stolee via GitGitGadget
2021-03-10 19:30   ` [PATCH v2 15/20] sparse-index: create extension for compatibility Derrick Stolee via GitGitGadget
2021-03-10 19:30   ` [PATCH v2 16/20] sparse-checkout: toggle sparse index from builtin Derrick Stolee via GitGitGadget
2021-03-10 19:31   ` [PATCH v2 17/20] sparse-checkout: disable sparse-index Derrick Stolee via GitGitGadget
2021-03-10 19:31   ` [PATCH v2 18/20] cache-tree: integrate with sparse directory entries Derrick Stolee via GitGitGadget
2021-03-10 19:31   ` [PATCH v2 19/20] sparse-index: loose integration with cache_tree_verify() Derrick Stolee via GitGitGadget
2021-03-10 19:31   ` [PATCH v2 20/20] p2000: add sparse-index repos Derrick Stolee via GitGitGadget
2021-03-11  0:07   ` [PATCH v2 00/20] Sparse Index: Design, Format, Tests Elijah Newren
2021-03-16 16:42   ` [PATCH v3 " Derrick Stolee via GitGitGadget
2021-03-16 16:42     ` [PATCH v3 01/20] sparse-index: design doc and format update Derrick Stolee via GitGitGadget
2021-03-19 23:43       ` Junio C Hamano
2021-03-23 11:16         ` Derrick Stolee
2021-03-23 20:10           ` Junio C Hamano
2021-03-23 20:42             ` Derrick Stolee
2021-03-16 16:42     ` [PATCH v3 02/20] t/perf: add performance test for sparse operations Derrick Stolee via GitGitGadget
2021-03-17  8:41       ` Ævar Arnfjörð Bjarmason
2021-03-17 13:05         ` Derrick Stolee
2021-03-17 13:21           ` Ævar Arnfjörð Bjarmason
2021-03-17 18:02             ` Derrick Stolee
2021-03-16 16:42     ` [PATCH v3 03/20] t1092: clean up script quoting Derrick Stolee via GitGitGadget
2021-03-17  8:47       ` Ævar Arnfjörð Bjarmason
2021-03-16 16:42     ` [PATCH v3 04/20] sparse-index: add guard to ensure full index Derrick Stolee via GitGitGadget
2021-03-16 16:42     ` [PATCH v3 05/20] sparse-index: implement ensure_full_index() Derrick Stolee via GitGitGadget
2021-03-17 13:03       ` Ævar Arnfjörð Bjarmason
2021-03-16 16:42     ` [PATCH v3 06/20] t1092: compare sparse-checkout to sparse-index Derrick Stolee via GitGitGadget
2021-03-16 16:42     ` [PATCH v3 07/20] test-read-cache: print cache entries with --table Derrick Stolee via GitGitGadget
2021-03-17 13:28       ` [RFC/PATCH 0/5] " Ævar Arnfjörð Bjarmason
2021-03-17 18:28         ` Elijah Newren
2021-03-17 19:46           ` Derrick Stolee
2021-03-17 20:26             ` Elijah Newren
2021-03-17 20:34               ` Derrick Stolee
2021-03-17 13:28       ` [RFC/PATCH 1/5] ls-files: defer read_index() after parse_options() etc Ævar Arnfjörð Bjarmason
2021-03-17 13:28       ` [RFC/PATCH 2/5] ls-files: make "mode" in show_ce() loop a variable Ævar Arnfjörð Bjarmason
2021-03-17 18:11         ` Elijah Newren
2021-03-24  0:46           ` Ævar Arnfjörð Bjarmason
2021-03-17 13:28       ` [RFC/PATCH 3/5] ls-files: add and use a new --sparse option Ævar Arnfjörð Bjarmason
2021-03-17 18:19         ` Elijah Newren
2021-03-17 18:27           ` Ævar Arnfjörð Bjarmason
2021-03-17 18:44             ` Elijah Newren
2021-03-17 20:43         ` Derrick Stolee
2021-03-24  0:52           ` Ævar Arnfjörð Bjarmason
2021-03-17 13:28       ` [RFC/PATCH 4/5] test-tool read-cache: --table is redundant to ls-files Ævar Arnfjörð Bjarmason
2021-03-17 13:28       ` [RFC/PATCH 5/5] test-tool: split up test-tool read-cache Ævar Arnfjörð Bjarmason
2021-03-17 13:32         ` Ævar Arnfjörð Bjarmason
2021-03-16 16:42     ` [PATCH v3 08/20] test-tool: don't force full index Derrick Stolee via GitGitGadget
2021-03-16 16:42     ` [PATCH v3 09/20] unpack-trees: ensure " Derrick Stolee via GitGitGadget
2021-03-16 16:42     ` [PATCH v3 10/20] sparse-checkout: hold pattern list in index Derrick Stolee via GitGitGadget
2021-03-16 16:42     ` Derrick Stolee via GitGitGadget [this message]
2021-03-17 13:43       ` [PATCH v3 11/20] sparse-index: convert from full to sparse Ævar Arnfjörð Bjarmason
2021-03-17 19:55         ` Derrick Stolee
2021-03-18 13:38           ` Derrick Stolee
2021-03-16 16:42     ` [PATCH v3 12/20] submodule: sparse-index should not collapse links Derrick Stolee via GitGitGadget
2021-03-16 16:42     ` [PATCH v3 13/20] unpack-trees: allow sparse directories Derrick Stolee via GitGitGadget
2021-03-17 13:35       ` Ævar Arnfjörð Bjarmason
2021-03-16 16:42     ` [PATCH v3 14/20] sparse-index: check index conversion happens Derrick Stolee via GitGitGadget
2021-03-16 16:42     ` [PATCH v3 15/20] sparse-index: create extension for compatibility Derrick Stolee via GitGitGadget
2021-03-16 16:42     ` [PATCH v3 16/20] sparse-checkout: toggle sparse index from builtin Derrick Stolee via GitGitGadget
2021-03-16 16:43     ` [PATCH v3 17/20] sparse-checkout: disable sparse-index Derrick Stolee via GitGitGadget
2021-03-16 16:43     ` [PATCH v3 18/20] cache-tree: integrate with sparse directory entries Derrick Stolee via GitGitGadget
2021-03-16 16:43     ` [PATCH v3 19/20] sparse-index: loose integration with cache_tree_verify() Derrick Stolee via GitGitGadget
2021-03-16 16:43     ` [PATCH v3 20/20] p2000: add sparse-index repos Derrick Stolee via GitGitGadget
2021-03-16 16:59     ` [PATCH v3 00/20] Sparse Index: Design, Format, Tests Derrick Stolee
2021-03-16 21:18     ` Elijah Newren
2021-03-18 21:50     ` Junio C Hamano
2021-03-19 13:00       ` Derrick Stolee
2021-03-23 13:44     ` [PATCH v4 " Derrick Stolee via GitGitGadget
2021-03-23 13:44       ` [PATCH v4 01/20] sparse-index: design doc and format update Derrick Stolee via GitGitGadget
2021-03-26 20:29         ` SZEDER Gábor
2021-03-28  1:47           ` Junio C Hamano
2021-03-29 14:32             ` Derrick Stolee
2021-03-23 13:44       ` [PATCH v4 02/20] t/perf: add performance test for sparse operations Derrick Stolee via GitGitGadget
2021-03-23 13:44       ` [PATCH v4 03/20] t1092: clean up script quoting Derrick Stolee via GitGitGadget
2021-03-23 13:44       ` [PATCH v4 04/20] sparse-index: add guard to ensure full index Derrick Stolee via GitGitGadget
2021-03-23 13:44       ` [PATCH v4 05/20] sparse-index: implement ensure_full_index() Derrick Stolee via GitGitGadget
2021-03-23 13:44       ` [PATCH v4 06/20] t1092: compare sparse-checkout to sparse-index Derrick Stolee via GitGitGadget
2021-03-23 13:44       ` [PATCH v4 07/20] test-read-cache: print cache entries with --table Derrick Stolee via GitGitGadget
2021-03-24  1:24         ` Ævar Arnfjörð Bjarmason
2021-03-24 12:33           ` Derrick Stolee
2021-03-25  3:41             ` Ævar Arnfjörð Bjarmason
2021-03-26  0:12               ` Elijah Newren
2021-03-28 15:31                 ` Ævar Arnfjörð Bjarmason
2021-03-29 19:46                   ` Derrick Stolee
2021-03-29 21:44                     ` Junio C Hamano
2021-03-30 11:28                       ` Derrick Stolee
2021-03-29 23:06                     ` Ævar Arnfjörð Bjarmason
2021-03-30 11:41                       ` Derrick Stolee
2021-03-29 22:02                   ` Elijah Newren
2021-03-23 13:44       ` [PATCH v4 08/20] test-tool: don't force full index Derrick Stolee via GitGitGadget
2021-03-23 13:44       ` [PATCH v4 09/20] unpack-trees: ensure " Derrick Stolee via GitGitGadget
2021-03-23 13:44       ` [PATCH v4 10/20] sparse-checkout: hold pattern list in index Derrick Stolee via GitGitGadget
2021-03-23 13:44       ` [PATCH v4 11/20] sparse-index: convert from full to sparse Derrick Stolee via GitGitGadget
2021-03-23 13:44       ` [PATCH v4 12/20] submodule: sparse-index should not collapse links Derrick Stolee via GitGitGadget
2021-03-23 13:44       ` [PATCH v4 13/20] unpack-trees: allow sparse directories Derrick Stolee via GitGitGadget
2021-03-23 13:44       ` [PATCH v4 14/20] sparse-index: check index conversion happens Derrick Stolee via GitGitGadget
2021-03-23 13:44       ` [PATCH v4 15/20] sparse-index: create extension for compatibility Derrick Stolee via GitGitGadget
2021-03-23 13:44       ` [PATCH v4 16/20] sparse-checkout: toggle sparse index from builtin Derrick Stolee via GitGitGadget
2021-03-23 13:44       ` [PATCH v4 17/20] sparse-checkout: disable sparse-index Derrick Stolee via GitGitGadget
2021-03-23 13:44       ` [PATCH v4 18/20] cache-tree: integrate with sparse directory entries Derrick Stolee via GitGitGadget
2021-03-23 13:44       ` [PATCH v4 19/20] sparse-index: loose integration with cache_tree_verify() Derrick Stolee via GitGitGadget
2021-03-23 13:44       ` [PATCH v4 20/20] p2000: add sparse-index repos Derrick Stolee via GitGitGadget
2021-03-23 16:16       ` [PATCH v4 00/20] Sparse Index: Design, Format, Tests Elijah Newren
2021-03-30 13:10       ` [PATCH v5 00/21] " Derrick Stolee via GitGitGadget
2021-03-30 13:10         ` [PATCH v5 01/21] sparse-index: design doc and format update Derrick Stolee via GitGitGadget
2021-03-30 13:10         ` [PATCH v5 02/21] t/perf: add performance test for sparse operations Derrick Stolee via GitGitGadget
2021-03-30 13:10         ` [PATCH v5 03/21] t1092: clean up script quoting Derrick Stolee via GitGitGadget
2021-03-30 13:10         ` [PATCH v5 04/21] sparse-index: add guard to ensure full index Derrick Stolee via GitGitGadget
2021-03-30 13:10         ` [PATCH v5 05/21] sparse-index: implement ensure_full_index() Derrick Stolee via GitGitGadget
2021-03-30 13:10         ` [PATCH v5 06/21] t1092: compare sparse-checkout to sparse-index Derrick Stolee via GitGitGadget
2021-03-30 13:10         ` [PATCH v5 07/21] test-read-cache: print cache entries with --table Derrick Stolee via GitGitGadget
2021-03-30 13:10         ` [PATCH v5 08/21] test-tool: don't force full index Derrick Stolee via GitGitGadget
2021-03-30 13:10         ` [PATCH v5 09/21] unpack-trees: ensure " Derrick Stolee via GitGitGadget
2021-03-30 13:10         ` [PATCH v5 10/21] sparse-checkout: hold pattern list in index Derrick Stolee via GitGitGadget
2021-03-30 13:10         ` [PATCH v5 11/21] sparse-index: add 'sdir' index extension Derrick Stolee via GitGitGadget
2021-03-30 13:10         ` [PATCH v5 12/21] sparse-index: convert from full to sparse Derrick Stolee via GitGitGadget
2021-03-30 13:10         ` [PATCH v5 13/21] submodule: sparse-index should not collapse links Derrick Stolee via GitGitGadget
2021-03-30 13:10         ` [PATCH v5 14/21] unpack-trees: allow sparse directories Derrick Stolee via GitGitGadget
2021-03-30 13:10         ` [PATCH v5 15/21] sparse-index: check index conversion happens Derrick Stolee via GitGitGadget
2021-03-30 13:10         ` [PATCH v5 16/21] sparse-index: add index.sparse config option Derrick Stolee via GitGitGadget
2021-03-30 13:11         ` [PATCH v5 17/21] sparse-checkout: toggle sparse index from builtin Derrick Stolee via GitGitGadget
2021-03-30 13:11         ` [PATCH v5 18/21] sparse-checkout: disable sparse-index Derrick Stolee via GitGitGadget
2021-03-30 13:11         ` [PATCH v5 19/21] cache-tree: integrate with sparse directory entries Derrick Stolee via GitGitGadget
2021-03-30 13:11         ` [PATCH v5 20/21] sparse-index: loose integration with cache_tree_verify() Derrick Stolee via GitGitGadget
2021-03-30 13:11         ` [PATCH v5 21/21] p2000: add sparse-index repos Derrick Stolee via GitGitGadget
2021-03-30 20:11         ` [PATCH v5 00/21] Sparse Index: Design, Format, Tests Junio C Hamano
2021-03-30 21:31           ` Derrick Stolee
2021-03-30 21:49             ` Junio C Hamano
2021-04-01  5:59             ` Elijah Newren
2021-04-01  4:38         ` Elijah Newren

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e41b14e03ebb143c874cc276adcbc36059f0c64e.1615912983.git.gitgitgadget@gmail.com \
    --to=gitgitgadget@gmail.com \
    --cc=avarab@gmail.com \
    --cc=derrickstolee@github.com \
    --cc=dstolee@microsoft.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=jrnieder@gmail.com \
    --cc=martin.agren@gmail.com \
    --cc=newren@gmail.com \
    --cc=pclouds@gmail.com \
    --cc=stolee@gmail.com \
    --cc=szeder.dev@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).