]> git.ipfire.org Git - thirdparty/git.git/commitdiff
string-list: add string_list_sort_u() that mimics "sort -u"
authorAmisha Chhajed <amishhhaaaa@gmail.com>
Thu, 29 Jan 2026 12:12:20 +0000 (17:42 +0530)
committerJunio C Hamano <gitster@pobox.com>
Thu, 29 Jan 2026 17:32:50 +0000 (09:32 -0800)
Many callsites of string_list_remove_duplicates() call it
immdediately after calling string_list_sort(), understandably
as the former requires string-list to be sorted, it is clear
that these places are sorting only to remove duplicates and
for no other reason.

Introduce a helper function string_list_sort_u that combines
these two calls that often appear together, to simplify
these callsites. Replace the current calls of those methods with
string_list_sort_u().

Signed-off-by: Amisha Chhajed <amishhhaaaa@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/clone.c
builtin/fast-export.c
builtin/pack-objects.c
builtin/sparse-checkout.c
help.c
notes.c
string-list.c
string-list.h
t/unit-tests/u-string-list.c

index b40cee596804f5547e73f38a36521cf889debce6..b14a39a687c8407c68c528d0f3801a23cdf0e22d 100644 (file)
@@ -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
index b90da5e616e0ef722337837511a73b83cb96a428..0c5d2386d81b92ebe4c72fc1081717f61609c652 100644 (file)
@@ -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)
index 5846b6a293a27b0841d54213cc71e616855e59f8..9807dd0eff0f6a7784a5258bda1dfc2580e3fbd0 100644 (file)
@@ -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);
index 15d51e60a865331c63be35523507a315646603aa..25de7692c91b2dfbfacc46224862fd01bf6a486b 100644 (file)
@@ -292,8 +292,7 @@ static void write_cone_to_file(FILE *fp, struct pattern_list *pl)
                        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");
 
@@ -316,8 +315,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);
diff --git a/help.c b/help.c
index 3c36d9c218f82477022920bc6fb7c48e9aae2780..fefd811f7a041f80dc69f4055bef746ce100eb18 100644 (file)
--- a/help.c
+++ b/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;
diff --git a/notes.c b/notes.c
index 8e00fd8c470dd2dec70619af537e9b06775eaf77..090c48bbd5230363bcd995b9c004a7b75e860097 100644 (file)
--- a/notes.c
+++ b/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,
index 08dc00984ccbd6e72398d7e58e7a6cb7fa2e39b9..020ed8fef7057daa5c531481ec8cffde7441f41e 100644 (file)
@@ -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)
 {
index fa6ba07853c52b1430295668bef37a5bb5765178..3ad862a18718a4a65b67ed7e20686b4c593ac0b3 100644 (file)
@@ -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.
index d469a06eca0d052d79c2c82f91da4e646d0d0648..7ad84cc1cd0e8f9fd9461efcfa202696f3f82fd0 100644 (file)
@@ -437,6 +437,40 @@ 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)