mirror of
https://github.com/git/git.git
synced 2026-03-04 22:47:35 +01:00
Merge branch 'ac/string-list-sort-u-and-tests' into next
The string_list API gains a new helper, string_list_sort_u(), and new unit tests to extend coverage. * ac/string-list-sort-u-and-tests: string-list: add string_list_sort_u() that mimics "sort -u" u-string-list: add unit tests for string-list methods
This commit is contained in:
@@ -1136,8 +1136,7 @@ int cmd_clone(int argc,
|
||||
int val;
|
||||
|
||||
/* remove duplicates */
|
||||
string_list_sort(&option_recurse_submodules);
|
||||
string_list_remove_duplicates(&option_recurse_submodules, 0);
|
||||
string_list_sort_u(&option_recurse_submodules, 0);
|
||||
|
||||
/*
|
||||
* NEEDSWORK: In a multi-working-tree world, this needs to be
|
||||
|
||||
@@ -1118,8 +1118,7 @@ static void get_tags_and_duplicates(struct rev_cmdline_info *info)
|
||||
free(full_name);
|
||||
}
|
||||
|
||||
string_list_sort(&extra_refs);
|
||||
string_list_remove_duplicates(&extra_refs, 0);
|
||||
string_list_sort_u(&extra_refs, 0);
|
||||
}
|
||||
|
||||
static void handle_tags_and_duplicates(struct string_list *extras)
|
||||
|
||||
@@ -3855,10 +3855,8 @@ static void read_packs_list_from_stdin(struct rev_info *revs)
|
||||
strbuf_reset(&buf);
|
||||
}
|
||||
|
||||
string_list_sort(&include_packs);
|
||||
string_list_remove_duplicates(&include_packs, 0);
|
||||
string_list_sort(&exclude_packs);
|
||||
string_list_remove_duplicates(&exclude_packs, 0);
|
||||
string_list_sort_u(&include_packs, 0);
|
||||
string_list_sort_u(&exclude_packs, 0);
|
||||
|
||||
repo_for_each_pack(the_repository, p) {
|
||||
const char *pack_name = pack_basename(p);
|
||||
|
||||
@@ -293,8 +293,7 @@ static void write_cone_to_file(FILE *fp, struct pattern_list *pl)
|
||||
string_list_append(&sl, pe->pattern);
|
||||
}
|
||||
|
||||
string_list_sort(&sl);
|
||||
string_list_remove_duplicates(&sl, 0);
|
||||
string_list_sort_u(&sl, 0);
|
||||
|
||||
fprintf(fp, "/*\n!/*/\n");
|
||||
|
||||
@@ -317,8 +316,7 @@ static void write_cone_to_file(FILE *fp, struct pattern_list *pl)
|
||||
|
||||
strbuf_release(&parent_pattern);
|
||||
|
||||
string_list_sort(&sl);
|
||||
string_list_remove_duplicates(&sl, 0);
|
||||
string_list_sort_u(&sl, 0);
|
||||
|
||||
for (i = 0; i < sl.nr; i++) {
|
||||
char *pattern = escaped_pattern(sl.items[i].string);
|
||||
|
||||
3
help.c
3
help.c
@@ -420,8 +420,7 @@ void list_cmds_by_config(struct string_list *list)
|
||||
if (repo_config_get_string_tmp(the_repository, "completion.commands", &cmd_list))
|
||||
return;
|
||||
|
||||
string_list_sort(list);
|
||||
string_list_remove_duplicates(list, 0);
|
||||
string_list_sort_u(list, 0);
|
||||
|
||||
while (*cmd_list) {
|
||||
struct strbuf sb = STRBUF_INIT;
|
||||
|
||||
3
notes.c
3
notes.c
@@ -921,8 +921,7 @@ int combine_notes_cat_sort_uniq(struct object_id *cur_oid,
|
||||
if (string_list_add_note_lines(&sort_uniq_list, new_oid))
|
||||
goto out;
|
||||
string_list_remove_empty_items(&sort_uniq_list, 0);
|
||||
string_list_sort(&sort_uniq_list);
|
||||
string_list_remove_duplicates(&sort_uniq_list, 0);
|
||||
string_list_sort_u(&sort_uniq_list, 0);
|
||||
|
||||
/* create a new blob object from sort_uniq_list */
|
||||
if (for_each_string_list(&sort_uniq_list,
|
||||
|
||||
@@ -247,6 +247,12 @@ void string_list_sort(struct string_list *list)
|
||||
QSORT_S(list->items, list->nr, cmp_items, &sort_ctx);
|
||||
}
|
||||
|
||||
void string_list_sort_u(struct string_list *list, int free_util)
|
||||
{
|
||||
string_list_sort(list);
|
||||
string_list_remove_duplicates(list, free_util);
|
||||
}
|
||||
|
||||
struct string_list_item *unsorted_string_list_lookup(struct string_list *list,
|
||||
const char *string)
|
||||
{
|
||||
|
||||
@@ -239,6 +239,12 @@ struct string_list_item *string_list_append_nodup(struct string_list *list, char
|
||||
*/
|
||||
void string_list_sort(struct string_list *list);
|
||||
|
||||
/**
|
||||
* Sort the list and then remove duplicate entries. If free_util is true,
|
||||
* call free() on the util members of any items that have to be deleted.
|
||||
*/
|
||||
void string_list_sort_u(struct string_list *list, int free_util);
|
||||
|
||||
/**
|
||||
* Like `string_list_has_string()` but for unsorted lists. Linear in
|
||||
* size of the list.
|
||||
|
||||
@@ -243,6 +243,138 @@ void test_string_list__filter(void)
|
||||
t_string_list_clear(&list, 0);
|
||||
}
|
||||
|
||||
static void t_string_list_has_string(
|
||||
struct string_list *list,
|
||||
const char *string,
|
||||
int expected)
|
||||
{
|
||||
int has_string = string_list_has_string(list, string);
|
||||
cl_assert_equal_i(has_string, expected);
|
||||
}
|
||||
|
||||
void test_string_list__has_string(void)
|
||||
{
|
||||
struct string_list list = STRING_LIST_INIT_DUP;
|
||||
|
||||
t_create_string_list_dup(&list, 0, NULL);
|
||||
t_string_list_has_string(&list, "", 0);
|
||||
|
||||
t_create_string_list_dup(&list, 0, "a", "b", "c", NULL);
|
||||
t_string_list_has_string(&list, "a", 1);
|
||||
t_string_list_has_string(&list, "b", 1);
|
||||
t_string_list_has_string(&list, "c", 1);
|
||||
t_string_list_has_string(&list, "d", 0);
|
||||
|
||||
t_string_list_clear(&list, 0);
|
||||
}
|
||||
|
||||
static void t_string_list_insert(struct string_list *expected_strings, ...)
|
||||
{
|
||||
struct string_list strings_to_insert = STRING_LIST_INIT_DUP;
|
||||
struct string_list list = STRING_LIST_INIT_DUP;
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, expected_strings);
|
||||
t_vcreate_string_list_dup(&strings_to_insert, 0, ap);
|
||||
va_end(ap);
|
||||
|
||||
for (size_t i = 0; i < strings_to_insert.nr; i++)
|
||||
string_list_insert(&list, strings_to_insert.items[i].string);
|
||||
|
||||
t_string_list_equal(&list, expected_strings);
|
||||
|
||||
string_list_clear(&strings_to_insert, 0);
|
||||
string_list_clear(&list, 0);
|
||||
}
|
||||
|
||||
void test_string_list__insert(void)
|
||||
{
|
||||
struct string_list expected_strings = STRING_LIST_INIT_DUP;
|
||||
|
||||
t_create_string_list_dup(&expected_strings, 0, NULL);
|
||||
t_string_list_insert(&expected_strings, NULL);
|
||||
|
||||
t_create_string_list_dup(&expected_strings, 0, "a", "b", NULL);
|
||||
t_string_list_insert(&expected_strings, "b", "a", "a", "b", NULL);
|
||||
|
||||
t_create_string_list_dup(&expected_strings, 0, "a", "b", "c", NULL);
|
||||
t_string_list_insert(&expected_strings, "c", "b", "a", "c", "b", NULL);
|
||||
|
||||
t_create_string_list_dup(&expected_strings, 0, "", "a", NULL);
|
||||
t_string_list_insert(&expected_strings, "a", "a", "a", "", NULL);
|
||||
|
||||
t_string_list_clear(&expected_strings, 0);
|
||||
}
|
||||
|
||||
static void t_string_list_sort(struct string_list *list, ...)
|
||||
{
|
||||
struct string_list expected_strings = STRING_LIST_INIT_DUP;
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, list);
|
||||
t_vcreate_string_list_dup(&expected_strings, 0, ap);
|
||||
va_end(ap);
|
||||
|
||||
string_list_sort(list);
|
||||
t_string_list_equal(list, &expected_strings);
|
||||
|
||||
string_list_clear(&expected_strings, 0);
|
||||
}
|
||||
|
||||
void test_string_list__sort(void)
|
||||
{
|
||||
struct string_list list = STRING_LIST_INIT_DUP;
|
||||
|
||||
t_create_string_list_dup(&list, 0, NULL);
|
||||
t_string_list_sort(&list, NULL);
|
||||
|
||||
t_create_string_list_dup(&list, 0, "b", "", "a", NULL);
|
||||
t_string_list_sort(&list, "", "a", "b", NULL);
|
||||
|
||||
t_create_string_list_dup(&list, 0, "c", "a", "b", "a", NULL);
|
||||
t_string_list_sort(&list, "a", "a", "b", "c", NULL);
|
||||
|
||||
t_string_list_clear(&list, 0);
|
||||
}
|
||||
|
||||
static void t_string_list_remove(
|
||||
struct string_list *expected_strings,
|
||||
struct string_list *list,
|
||||
char const *str)
|
||||
{
|
||||
string_list_remove(list, str, 0);
|
||||
t_string_list_equal(list, expected_strings);
|
||||
}
|
||||
|
||||
void test_string_list__remove(void)
|
||||
{
|
||||
struct string_list expected_strings = STRING_LIST_INIT_DUP;
|
||||
struct string_list list = STRING_LIST_INIT_DUP;
|
||||
|
||||
t_create_string_list_dup(&expected_strings, 0, NULL);
|
||||
t_create_string_list_dup(&list, 0, NULL);
|
||||
t_string_list_remove(&expected_strings, &list, "");
|
||||
|
||||
t_create_string_list_dup(&expected_strings, 0, "a", NULL);
|
||||
t_create_string_list_dup(&list, 0, "a", "a", NULL);
|
||||
t_string_list_remove(&expected_strings, &list, "a");
|
||||
|
||||
t_create_string_list_dup(&expected_strings, 0, "a", "b", "b", NULL);
|
||||
t_create_string_list_dup(&list, 0, "a", "b", "b", "c", NULL);
|
||||
t_string_list_remove(&expected_strings, &list, "c");
|
||||
|
||||
t_create_string_list_dup(&expected_strings, 0, "a", "b", "d", NULL);
|
||||
t_create_string_list_dup(&list, 0, "a", "b", "c", "d", NULL);
|
||||
t_string_list_remove(&expected_strings, &list, "c");
|
||||
|
||||
t_create_string_list_dup(&expected_strings, 0, "a", "b", "c", "d", NULL);
|
||||
t_create_string_list_dup(&list, 0, "a", "b", "c", "d", NULL);
|
||||
t_string_list_remove(&expected_strings, &list, "e");
|
||||
|
||||
t_string_list_clear(&expected_strings, 0);
|
||||
t_string_list_clear(&list, 0);
|
||||
}
|
||||
|
||||
static void t_string_list_remove_duplicates(struct string_list *list, ...)
|
||||
{
|
||||
struct string_list expected_strings = STRING_LIST_INIT_DUP;
|
||||
@@ -304,3 +436,114 @@ void test_string_list__remove_duplicates(void)
|
||||
|
||||
t_string_list_clear(&list, 0);
|
||||
}
|
||||
|
||||
static void t_string_list_sort_u(struct string_list *list, ...)
|
||||
{
|
||||
struct string_list expected_strings = STRING_LIST_INIT_DUP;
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, list);
|
||||
t_vcreate_string_list_dup(&expected_strings, 0, ap);
|
||||
va_end(ap);
|
||||
|
||||
string_list_sort_u(list, 0);
|
||||
t_string_list_equal(list, &expected_strings);
|
||||
|
||||
string_list_clear(&expected_strings, 0);
|
||||
}
|
||||
|
||||
void test_string_list__sort_u(void)
|
||||
{
|
||||
struct string_list list = STRING_LIST_INIT_DUP;
|
||||
|
||||
t_create_string_list_dup(&list, 0, NULL);
|
||||
t_string_list_sort_u(&list, NULL);
|
||||
|
||||
t_create_string_list_dup(&list, 0, "", "", "", "", NULL);
|
||||
t_string_list_sort_u(&list, "", NULL);
|
||||
|
||||
t_create_string_list_dup(&list, 0, "b", "a", "a", "", NULL);
|
||||
t_string_list_sort_u(&list, "", "a", "b", NULL);
|
||||
|
||||
t_create_string_list_dup(&list, 0, "b", "a", "a", "d", "c", "c", NULL);
|
||||
t_string_list_sort_u(&list, "a", "b", "c", "d", NULL);
|
||||
|
||||
t_string_list_clear(&list, 0);
|
||||
}
|
||||
|
||||
static void t_string_list_remove_empty_items(
|
||||
struct string_list *expected_strings,
|
||||
struct string_list *list)
|
||||
{
|
||||
string_list_remove_empty_items(list, 0);
|
||||
t_string_list_equal(list, expected_strings);
|
||||
}
|
||||
|
||||
void test_string_list__remove_empty_items(void)
|
||||
{
|
||||
struct string_list expected_strings = STRING_LIST_INIT_DUP;
|
||||
struct string_list list = STRING_LIST_INIT_DUP;
|
||||
|
||||
t_create_string_list_dup(&expected_strings, 0, NULL);
|
||||
t_create_string_list_dup(&list, 0, "", "", "", NULL);
|
||||
t_string_list_remove_empty_items(&expected_strings, &list);
|
||||
|
||||
t_create_string_list_dup(&expected_strings, 0, "a", "b", NULL);
|
||||
t_create_string_list_dup(&list, 0, "a", "", "b", "", NULL);
|
||||
t_string_list_remove_empty_items(&expected_strings, &list);
|
||||
|
||||
t_string_list_clear(&expected_strings, 0);
|
||||
t_string_list_clear(&list, 0);
|
||||
}
|
||||
|
||||
static void t_string_list_unsorted_string_list_has_string(
|
||||
struct string_list *list,
|
||||
const char *str, int expected)
|
||||
{
|
||||
int has_string = unsorted_string_list_has_string(list, str);
|
||||
cl_assert_equal_i(has_string, expected);
|
||||
}
|
||||
|
||||
void test_string_list__unsorted_string_list_has_string(void)
|
||||
{
|
||||
struct string_list list = STRING_LIST_INIT_DUP;
|
||||
|
||||
t_create_string_list_dup(&list, 0, "b", "d", "a", NULL);
|
||||
t_string_list_unsorted_string_list_has_string(&list, "a", 1);
|
||||
t_string_list_unsorted_string_list_has_string(&list, "b", 1);
|
||||
t_string_list_unsorted_string_list_has_string(&list, "c", 0);
|
||||
t_string_list_unsorted_string_list_has_string(&list, "d", 1);
|
||||
|
||||
t_string_list_clear(&list, 0);
|
||||
}
|
||||
|
||||
static void t_string_list_unsorted_string_list_delete_item(
|
||||
struct string_list *expected_list,
|
||||
struct string_list *list,
|
||||
int i)
|
||||
{
|
||||
unsorted_string_list_delete_item(list, i, 0);
|
||||
|
||||
t_string_list_equal(list, expected_list);
|
||||
}
|
||||
|
||||
void test_string_list__unsorted_string_list_delete_item(void)
|
||||
{
|
||||
struct string_list expected_strings = STRING_LIST_INIT_DUP;
|
||||
struct string_list list = STRING_LIST_INIT_DUP;
|
||||
|
||||
t_create_string_list_dup(&expected_strings, 0, "a", "c", "b", NULL);
|
||||
t_create_string_list_dup(&list, 0, "a", "d", "b", "c", NULL);
|
||||
t_string_list_unsorted_string_list_delete_item(&expected_strings, &list, 1);
|
||||
|
||||
t_create_string_list_dup(&expected_strings, 0, NULL);
|
||||
t_create_string_list_dup(&list, 0, "", NULL);
|
||||
t_string_list_unsorted_string_list_delete_item(&expected_strings, &list, 0);
|
||||
|
||||
t_create_string_list_dup(&expected_strings, 0, "a", "d", "c", "b", NULL);
|
||||
t_create_string_list_dup(&list, 0, "a", "d", "c", "b", "d", NULL);
|
||||
t_string_list_unsorted_string_list_delete_item(&expected_strings, &list, 4);
|
||||
|
||||
t_string_list_clear(&expected_strings, 0);
|
||||
t_string_list_clear(&list, 0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user