Skip to content

Commit 07be7b8

Browse files
committed
sparse-checkout: list folders in cone mode
When core.sparseCheckoutCone is enabled, the 'git sparse-checkout set' command taks 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 blobs 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 <[email protected]>
1 parent 761e3d2 commit 07be7b8

File tree

3 files changed

+42
-1
lines changed

3 files changed

+42
-1
lines changed

Documentation/git-sparse-checkout.txt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ THE FUTURE.
2828
COMMANDS
2929
--------
3030
'list'::
31-
Provide a list of the contents in the sparse-checkout file.
31+
Describe the patterns in the sparse-checkout file.
3232

3333
'init'::
3434
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.
150150
If the patterns do match the expected format, then Git will use faster hash-
151151
based algorithms to compute inclusion in the sparse-checkout.
152152

153+
In the cone mode case, the `git sparse-checkout list` subcommand will list the
154+
folders that define the recursive patterns. For the example sparse-checkout file
155+
above, the output is as follows:
156+
157+
--------------------------
158+
$ git sparse-checkout list
159+
A/B/C
160+
--------------------------
161+
153162
If `core.ignoreCase=true`, then the pattern-matching algorithm will use a
154163
case-insensitive check. This corrects for case mismatched filenames in the
155164
'git sparse-checkout set' command to reflect the expected cone in the working

builtin/sparse-checkout.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ static int sparse_checkout_list(int argc, const char **argv)
5353

5454
memset(&pl, 0, sizeof(pl));
5555

56+
pl.use_cone_patterns = core_sparse_checkout_cone;
57+
5658
sparse_filename = get_sparse_checkout_filename();
5759
res = add_patterns_from_file_to_list(sparse_filename, "", 0, &pl, NULL);
5860
free(sparse_filename);
@@ -62,6 +64,25 @@ static int sparse_checkout_list(int argc, const char **argv)
6264
return 0;
6365
}
6466

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+
6586
write_patterns_to_file(stdout, &pl);
6687
clear_pattern_list(&pl);
6788

t/t1091-sparse-checkout-builtin.sh

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,17 @@ test_expect_success 'cone mode: init and set' '
246246
test_cmp expect dir
247247
'
248248

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+
249260
test_expect_success 'cone mode: set with nested folders' '
250261
git -C repo sparse-checkout set deep deep/deeper1/deepest 2>err &&
251262
test_line_count = 0 err &&

0 commit comments

Comments
 (0)