@matheusbsbs / matheus-bagliano / commits / de11951b03
Fork 0

sparse-checkout: list directories in cone mode

When core.sparseCheckoutCone is enabled, the 'git sparse-checkout set' command takes a list of directories as input, then creates an ordered list of sparse-checkout patterns such that those directories are recursively included and all sibling entries along the parent directories are also included. Listing the patterns is less user-friendly than the directories 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 directories 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> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Derrick Stolee committed Dec 30, 2019 at 15:33 UTC de11951b0393500cbf20d3e2bcd2e605d757ea8f
3 files changed +42 -1
Documentation/git-sparse-checkout.txt
+10 -1
@@ -28,7 +28,7 @@ THE FUTURE.
28 COMMANDS
29 --------
30 'list'::
31 - Provide a list of the contents in the sparse-checkout file.
31 + Describe the patterns in the sparse-checkout file.
32
33 'init'::
34 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.
150 If the patterns do match the expected format, then Git will use faster hash-
151 based algorithms to compute inclusion in the sparse-checkout.
152
153 +In the cone mode case, the `git sparse-checkout list` subcommand will list the
154 +directories that define the recursive patterns. For the example sparse-checkout
155 +file above, the output is as follows:
156 +
157 +--------------------------
158 +$ git sparse-checkout list
159 +A/B/C
160 +--------------------------
161 +
162 If `core.ignoreCase=true`, then the pattern-matching algorithm will use a
163 case-insensitive check. This corrects for case mismatched filenames in the
164 'git sparse-checkout set' command to reflect the expected cone in the working
builtin/sparse-checkout.c
+21
@@ -53,6 +53,8 @@ static int sparse_checkout_list(int argc, const char **argv)
53
54 memset(&pl, 0, sizeof(pl));
55
56 + pl.use_cone_patterns = core_sparse_checkout_cone;
57 +
58 sparse_filename = get_sparse_checkout_filename();
59 res = add_patterns_from_file_to_list(sparse_filename, "", 0, &pl, NULL);
60 free(sparse_filename);
@@ -62,6 +64,25 @@ static int sparse_checkout_list(int argc, const char **argv)
64 return 0;
65 }
66
67 + if (pl.use_cone_patterns) {
68 + int i;
69 + struct pattern_entry *pe;
70 + struct hashmap_iter iter;
71 + struct string_list sl = STRING_LIST_INIT_DUP;
72 +
73 + hashmap_for_each_entry(&pl.recursive_hashmap, &iter, pe, ent) {
74 + /* pe->pattern starts with "/", skip it */
75 + string_list_insert(&sl, pe->pattern + 1);
76 + }
77 +
78 + string_list_sort(&sl);
79 +
80 + for (i = 0; i < sl.nr; i++)
81 + printf("%s\n", sl.items[i].string);
82 +
83 + return 0;
84 + }
85 +
86 write_patterns_to_file(stdout, &pl);
87 clear_pattern_list(&pl);
88
t/t1091-sparse-checkout-builtin.sh
+11
@@ -246,6 +246,17 @@ test_expect_success 'cone mode: init and set' '
246 test_cmp expect dir
247 '
248
249 +test_expect_success 'cone mode: list' '
250 + cat >expect <<-EOF &&
251 + folder1
252 + folder2
253 + EOF
254 + git -C repo sparse-checkout set --stdin <expect &&
255 + git -C repo sparse-checkout list >actual 2>err &&
256 + test_must_be_empty err &&
257 + test_cmp expect actual
258 +'
259 +
260 test_expect_success 'cone mode: set with nested folders' '
261 git -C repo sparse-checkout set deep deep/deeper1/deepest 2>err &&
262 test_line_count = 0 err &&