Skip to content

Commit

Permalink
Merge branch 'ds/sparse-list-in-cone-mode' into jch
Browse files Browse the repository at this point in the history
"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
  • Loading branch information
gitster committed Jan 5, 2020
2 parents 53ed9a8 + 4fd683b commit 337ac6e
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 1 deletion.
21 changes: 20 additions & 1 deletion Documentation/git-sparse-checkout.txt
Expand Up @@ -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
Expand Down Expand Up @@ -150,11 +150,30 @@ 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
directories 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
directory.


SUBMODULES
----------

If your repository contains one or more submodules, then those submodules will
appear based on which you initialized with the `git submodule` command. If
your sparse-checkout patterns exclude an initialized submodule, then that
submodule will still appear in your working directory.


SEE ALSO
--------

Expand Down
21 changes: 21 additions & 0 deletions builtin/sparse-checkout.c
Expand Up @@ -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);
Expand All @@ -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);

Expand Down
39 changes: 39 additions & 0 deletions t/t1091-sparse-checkout-builtin.sh
Expand Up @@ -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 &&
Expand Down Expand Up @@ -329,4 +340,32 @@ test_expect_success 'cone mode: set with core.ignoreCase=true' '
test_cmp expect dir
'

test_expect_success 'interaction with submodules' '
git clone repo super &&
(
cd super &&
mkdir modules &&
git submodule add ../repo modules/child &&
git add . &&
git commit -m "add submodule" &&
git sparse-checkout init --cone &&
git sparse-checkout set folder1
) &&
list_files super >dir &&
cat >expect <<-\EOF &&
a
folder1
modules
EOF
test_cmp expect dir &&
list_files super/modules/child >dir &&
cat >expect <<-\EOF &&
a
deep
folder1
folder2
EOF
test_cmp expect dir
'

test_done

0 comments on commit 337ac6e

Please sign in to comment.