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
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)
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);
string_list_insert(&sl, pe->pattern);
}
- string_list_sort(&sl);
- string_list_remove_duplicates(&sl, 0);
+ string_list_sort_u(&sl, 0);
fprintf(fp, "/*\n!/*/\n");
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);
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;
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,
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)
{
*/
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.
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)