git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 1/2] sparse-checkout: list folders in cone mode

From
Derrick Stolee via GitGitGadget <gitgitgadget@gmail.com>
Date
Dec 27, 2019, 18:47 UTC
Message-ID
<d6f4f404866e30e9de89991bb39f2908facb30ae.1577472469.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.500.v2.git.1577472469.gitgitgadget@gmail.com>
From: Derrick Stolee <dstolee@microsoft.com>

When core.sparseCheckoutCone is enabled, the 'git sparse-checkout set' command takes a list of folders as input, then creates an ordered list of sparse-checkout patterns such that those folders are recursively included and all sibling entries along the parent folders are also included. Listing the patterns is less user-friendly than the folders themselves.

In cone mode, and as long as the patterns match the expected cone-mode pattern types, change the output of 'git sparse-checkout list' to only show the folders that created the patterns.

With this change, the following piped commands would not change the working directory:

	git sparse-checkout list | git sparse-checkout set --stdin

The only time this would not work is if core.sparseCheckoutCone is true, but the sparse-checkout file contains patterns that do not match the expected pattern types for cone mode.

Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
---
 Documentation/git-sparse-checkout.txt | 11 ++++++++++-
 builtin/sparse-checkout.c             | 21 +++++++++++++++++++++
 t/t1091-sparse-checkout-builtin.sh    | 11 +++++++++++
 3 files changed, 42 insertions(+), 1 deletion(-)
diff --git a/Documentation/git-sparse-checkout.txt b/Documentation/git-sparse-checkout.txt
index 9c3c66cc37..dcca9ee826 100644
--- a/Documentation/git-sparse-checkout.txt
+++ b/Documentation/git-sparse-checkout.txt
@@ -28,7 +28,7 @@ THE FUTURE.
 COMMANDS
 --------
 'list'::
-	Provide a list of the contents in the sparse-checkout file.
+	Describe the patterns in the sparse-checkout file.
 
 'init'::
 	Enable the `core.sparseCheckout` setting. If the
@@ -150,6 +150,15 @@ expecting patterns of these types. Git will warn if the patterns do not match.
 If the patterns do match the expected format, then Git will use faster hash-
 based algorithms to compute inclusion in the sparse-checkout.
 
+In the cone mode case, the `git sparse-checkout list` subcommand will list the
+folders that define the recursive patterns. For the example sparse-checkout file
+above, the output is as follows:
+
+--------------------------
+$ git sparse-checkout list
+A/B/C
+--------------------------
+
 If `core.ignoreCase=true`, then the pattern-matching algorithm will use a
 case-insensitive check. This corrects for case mismatched filenames in the
 'git sparse-checkout set' command to reflect the expected cone in the working
diff --git a/builtin/sparse-checkout.c b/builtin/sparse-checkout.c
index 5d62f7a66d..b3bed891cb 100644
--- a/builtin/sparse-checkout.c
+++ b/builtin/sparse-checkout.c
@@ -53,6 +53,8 @@ static int sparse_checkout_list(int argc, const char **argv)
 
 	memset(&pl, 0, sizeof(pl));
 
+	pl.use_cone_patterns = core_sparse_checkout_cone;
+
 	sparse_filename = get_sparse_checkout_filename();
 	res = add_patterns_from_file_to_list(sparse_filename, "", 0, &pl, NULL);
 	free(sparse_filename);
@@ -62,6 +64,25 @@ static int sparse_checkout_list(int argc, const char **argv)
 		return 0;
 	}
 
+	if (pl.use_cone_patterns) {
+		int i;
+		struct pattern_entry *pe;
+		struct hashmap_iter iter;
+		struct string_list sl = STRING_LIST_INIT_DUP;
+
+		hashmap_for_each_entry(&pl.recursive_hashmap, &iter, pe, ent) {
+			/* pe->pattern starts with "/", skip it */
+			string_list_insert(&sl, pe->pattern + 1);
+		}
+
+		string_list_sort(&sl);
+
+		for (i = 0; i < sl.nr; i++)
+			printf("%s\n", sl.items[i].string);
+
+		return 0;
+	}
+
 	write_patterns_to_file(stdout, &pl);
 	clear_pattern_list(&pl);
 
diff --git a/t/t1091-sparse-checkout-builtin.sh b/t/t1091-sparse-checkout-builtin.sh
index 6f7e2d0c9e..37f6d8fa90 100755
--- a/t/t1091-sparse-checkout-builtin.sh
+++ b/t/t1091-sparse-checkout-builtin.sh
@@ -246,6 +246,17 @@ test_expect_success 'cone mode: init and set' '
 	test_cmp expect dir
 '
 
+test_expect_success 'cone mode: list' '
+	cat >expect <<-EOF &&
+		folder1
+		folder2
+	EOF
+	git -C repo sparse-checkout set --stdin <expect &&
+	git -C repo sparse-checkout list >actual 2>err &&
+	test_must_be_empty err &&
+	test_cmp expect actual
+'
+
 test_expect_success 'cone mode: set with nested folders' '
 	git -C repo sparse-checkout set deep deep/deeper1/deepest 2>err &&
 	test_line_count = 0 err &&
-- 
gitgitgadget
Previous: Derrick Stolee via GitGitGadgetNext: Elijah Newren
Message 7 of 18 in “sparse-checkout: list directories in cone mode”
  1. 0/1 sparse-checkout: list directories in cone modeDerrick Stolee via GitGitGadget, Dec 26, 2019
  2. 1/1 sparse-checkout: list folders in cone modeDerrick Stolee via GitGitGadget, Dec 26, 2019
  3. Junio C HamanoDec 26, 2019
  4. Derrick StoleeDec 27, 2019
  5. Elijah NewrenDec 27, 2019
  6. 0/2 sparse-checkout: list directories in cone modeDerrick Stolee via GitGitGadget, Dec 27, 2019
  7. 1/2 sparse-checkout: list folders in cone modeDerrick Stolee via GitGitGadget, Dec 27, 2019
  8. Elijah NewrenDec 27, 2019
  9. 2/2 sparse-checkout: document interactions with submodulesDerrick Stolee via GitGitGadget, Dec 27, 2019
  10. Eric SunshineDec 27, 2019
  11. Derrick StoleeDec 30, 2019
  12. Elijah NewrenDec 27, 2019
  13. Junio C HamanoDec 27, 2019
  14. 0/2 sparse-checkout: list directories in cone modeDerrick Stolee via GitGitGadget, Dec 30, 2019
  15. 1/2 sparse-checkout: list directories in cone modeDerrick Stolee via GitGitGadget, Dec 30, 2019
  16. 2/2 sparse-checkout: document interactions with submodulesDerrick Stolee via GitGitGadget, Dec 30, 2019
  17. Elijah NewrenDec 30, 2019
  18. Elijah NewrenDec 27, 2019

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.