Skip to content

Commit 337ac6e

Browse files
committed
Merge branch 'ds/sparse-list-in-cone-mode' into jch
"git sparse-checkout list" subcommand learned to give its output in a more concise form when the "cone" mode is in effect. * ds/sparse-list-in-cone-mode: sparse-checkout: document interactions with submodules sparse-checkout: list directories in cone mode
2 parents 53ed9a8 + 4fd683b commit 337ac6e

File tree

3 files changed

+80
-1
lines changed

3 files changed

+80
-1
lines changed

Documentation/git-sparse-checkout.txt

Lines changed: 20 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,11 +150,30 @@ 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+
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+
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
156165
directory.
157166

167+
168+
SUBMODULES
169+
----------
170+
171+
If your repository contains one or more submodules, then those submodules will
172+
appear based on which you initialized with the `git submodule` command. If
173+
your sparse-checkout patterns exclude an initialized submodule, then that
174+
submodule will still appear in your working directory.
175+
176+
158177
SEE ALSO
159178
--------
160179

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: 39 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 &&
@@ -329,4 +340,32 @@ test_expect_success 'cone mode: set with core.ignoreCase=true' '
329340
test_cmp expect dir
330341
'
331342

343+
test_expect_success 'interaction with submodules' '
344+
git clone repo super &&
345+
(
346+
cd super &&
347+
mkdir modules &&
348+
git submodule add ../repo modules/child &&
349+
git add . &&
350+
git commit -m "add submodule" &&
351+
git sparse-checkout init --cone &&
352+
git sparse-checkout set folder1
353+
) &&
354+
list_files super >dir &&
355+
cat >expect <<-\EOF &&
356+
a
357+
folder1
358+
modules
359+
EOF
360+
test_cmp expect dir &&
361+
list_files super/modules/child >dir &&
362+
cat >expect <<-\EOF &&
363+
a
364+
deep
365+
folder1
366+
folder2
367+
EOF
368+
test_cmp expect dir
369+
'
370+
332371
test_done

0 commit comments

Comments
 (0)