Merge branch 'ac/sparse-checkout-string-list-cleanup' into next

Code clean-up.

* ac/sparse-checkout-string-list-cleanup:
  sparse-checkout: optimize string_list construction and add tests to verify deduplication.
This commit is contained in:
Junio C Hamano
2026-01-23 13:35:36 -08:00
2 changed files with 52 additions and 3 deletions

View File

@@ -91,10 +91,11 @@ static int sparse_checkout_list(int argc, const char **argv, const char *prefix,
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_append(&sl, pe->pattern + 1);
}
string_list_sort(&sl);
string_list_remove_duplicates(&sl, 0);
for (i = 0; i < sl.nr; i++) {
quote_c_style(sl.items[i].string, NULL, stdout, 0);
@@ -289,7 +290,7 @@ static void write_cone_to_file(FILE *fp, struct pattern_list *pl)
if (!hashmap_contains_parent(&pl->recursive_hashmap,
pe->pattern,
&parent_pattern))
string_list_insert(&sl, pe->pattern);
string_list_append(&sl, pe->pattern);
}
string_list_sort(&sl);
@@ -311,7 +312,7 @@ static void write_cone_to_file(FILE *fp, struct pattern_list *pl)
if (!hashmap_contains_parent(&pl->recursive_hashmap,
pe->pattern,
&parent_pattern))
string_list_insert(&sl, pe->pattern);
string_list_append(&sl, pe->pattern);
}
strbuf_release(&parent_pattern);

View File

@@ -817,6 +817,54 @@ test_expect_success 'cone mode clears ignored subdirectories' '
test_cmp expect out
'
test_expect_success 'sparse-checkout deduplicates repeated cone patterns' '
rm -f repo/.git/info/sparse-checkout &&
git -C repo sparse-checkout init --cone &&
git -C repo sparse-checkout add --stdin <<-\EOF &&
foo/bar/baz
a/b/c
foo/bar/baz
a/b
EOF
cat >expect <<-\EOF &&
/*
!/*/
/a/
!/a/*/
/foo/
!/foo/*/
/foo/bar/
!/foo/bar/*/
/a/b/
/foo/bar/baz/
EOF
test_cmp expect repo/.git/info/sparse-checkout
'
test_expect_success 'sparse-checkout list deduplicates repeated cone patterns' '
rm -f repo/.git/info/sparse-checkout &&
git -C repo sparse-checkout init --cone &&
cat <<-\EOF >repo/.git/info/sparse-checkout &&
/*
!/*/
/a/
!/a/*/
/foo/
!/foo/*/
/foo/bar/
!/foo/bar/*/
/a/b/
/foo/bar/baz/
/foo/bar/baz/
EOF
git -C repo sparse-checkout list >actual &&
cat <<-\EOF >expect &&
a/b
foo/bar/baz
EOF
test_cmp expect actual
'
test_expect_success 'malformed cone-mode patterns' '
git -C repo sparse-checkout init --cone &&
mkdir -p repo/foo/bar &&