From: Amisha Chhajed <amishhhaaaa@gmail.com>
To: git@vger.kernel.org
Cc: Junio C Hamano <gitster@pobox.com>,
Derrick Stolee <stolee@gmail.com>,
Elijah Newren <newren@gmail.com>, Jeff King <peff@peff.net>,
Amisha Chhajed <amishhhaaaa@gmail.com>
Subject: [PATCH 2/2] string-list: add string_list_sort_u() that mimics "sort -u"
Date: Mon, 26 Jan 2026 01:47:43 +0530 [thread overview]
Message-ID: <20260125201743.64317-2-amishhhaaaa@gmail.com> (raw)
In-Reply-To: <20260125201743.64317-1-amishhhaaaa@gmail.com>
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>
---
builtin/clone.c | 3 +--
builtin/fast-export.c | 3 +--
builtin/pack-objects.c | 6 ++----
builtin/sparse-checkout.c | 6 ++----
help.c | 3 +--
notes.c | 3 +--
string-list.c | 6 ++++++
string-list.h | 6 ++++++
t/unit-tests/u-string-list.c | 34 ++++++++++++++++++++++++++++++++++
9 files changed, 54 insertions(+), 16 deletions(-)
diff --git a/builtin/clone.c b/builtin/clone.c
index b19b302b06..f05364c268 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -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
diff --git a/builtin/fast-export.c b/builtin/fast-export.c
index b90da5e616..0c5d2386d8 100644
--- a/builtin/fast-export.c
+++ b/builtin/fast-export.c
@@ -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)
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index ca44b7894f..649dab4ed0 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -3849,10 +3849,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);
diff --git a/builtin/sparse-checkout.c b/builtin/sparse-checkout.c
index 15d51e60a8..25de7692c9 100644
--- a/builtin/sparse-checkout.c
+++ b/builtin/sparse-checkout.c
@@ -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 20e114432d..2070095b6f 100644
--- 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 8e00fd8c47..090c48bbd5 100644
--- 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,
diff --git a/string-list.c b/string-list.c
index 08dc00984c..020ed8fef7 100644
--- a/string-list.c
+++ b/string-list.c
@@ -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)
{
diff --git a/string-list.h b/string-list.h
index fa6ba07853..3ad862a187 100644
--- a/string-list.h
+++ b/string-list.h
@@ -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.
diff --git a/t/unit-tests/u-string-list.c b/t/unit-tests/u-string-list.c
index 6b4b858330..f91bb60e09 100644
--- a/t/unit-tests/u-string-list.c
+++ b/t/unit-tests/u-string-list.c
@@ -432,6 +432,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)
{
string_list_remove_empty_items(list, 0);
--
2.51.0
next prev parent reply other threads:[~2026-01-25 20:18 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-22 17:15 [RFC PATCH 0/2] Adding string_list_sort_u to replace combined calls of string_list_sort and string_list_remove_duplicates calls Amisha Chhajed
2026-01-22 17:15 ` [RFC PATCH 1/2] Adding string_list_sort_u which sorts a list then deduplicates it Amisha Chhajed
2026-01-22 22:07 ` Junio C Hamano
2026-01-25 20:23 ` Amisha Chhajed
2026-01-22 17:15 ` [RFC PATCH 2/2] Replacing calls of string_list_sort and string_list_remove_duplicates with the combined variant string_list_u Amisha Chhajed
2026-01-22 22:19 ` Junio C Hamano
2026-01-22 22:09 ` [RFC PATCH 0/2] Adding string_list_sort_u to replace combined calls of string_list_sort and string_list_remove_duplicates calls Junio C Hamano
2026-01-25 20:14 ` [PATCH 1/2] u-string-list: add unit tests for string-list methods Amisha Chhajed
2026-01-25 20:15 ` [PATCH 2/2] string-list: add string_list_sort_u() that mimics "sort -u" Amisha Chhajed
2026-01-29 12:12 ` [PATCH v3 1/2] u-string-list: add unit tests for string-list methods Amisha Chhajed
2026-01-29 12:12 ` [PATCH v3 2/2] string-list: add string_list_sort_u() that mimics "sort -u" Amisha Chhajed
2026-01-29 12:14 ` [PATCH v3 1/2] u-string-list: add unit tests for string-list methods Amisha Chhajed
2026-01-30 19:51 ` [PATCH 2/2] string-list: add string_list_sort_u() that mimics "sort -u" Kristoffer Haugsbakk
2026-01-30 21:45 ` Junio C Hamano
2026-01-26 7:12 ` [PATCH 1/2] u-string-list: add unit tests for string-list methods Junio C Hamano
2026-01-26 18:57 ` Amisha Chhajed
2026-01-26 19:12 ` Junio C Hamano
2026-01-25 20:17 ` Amisha Chhajed
2026-01-25 20:17 ` Amisha Chhajed [this message]
2026-01-26 18:56 ` [PATCH v2 " Amisha Chhajed
2026-01-26 18:56 ` [PATCH v2 2/2] string-list: add string_list_sort_u() that mimics "sort -u" Amisha Chhajed
2026-01-26 20:11 ` Junio C Hamano
2026-01-27 1:27 ` Amisha Chhajed
2026-01-26 19:50 ` [PATCH v2 1/2] u-string-list: add unit tests for string-list methods Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260125201743.64317-2-amishhhaaaa@gmail.com \
--to=amishhhaaaa@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=newren@gmail.com \
--cc=peff@peff.net \
--cc=stolee@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.