hook: move unsorted_string_list_remove() to string-list.[ch]

Move the convenience wrapper from hook to string-list since it's a more suitable place. Add a doc comment to the header. Also add a free_util arg to make the function more generic and make the API similar to other functions in string-list.h. Update the existing call-sites. Suggested-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Adrian Ratiu committed Mar 25, 2026 at 21:54 UTC add3564d2f2804ad37b9af773ec6420b497a1725
3 files changed +20 -11
hook.c
+3 -11
@@ -110,14 +110,6 @@ static void list_hooks_add_default(struct repository *r, const char *hookname,
110 string_list_append(hook_list, hook_path)->util = h;
111 }
112
113 -static void unsorted_string_list_remove(struct string_list *list,
114 - const char *str)
115 -{
116 - struct string_list_item *item = unsorted_string_list_lookup(list, str);
117 - if (item)
118 - unsorted_string_list_delete_item(list, item - list->items, 0);
119 -}
120 -
113 /*
114 * Callback struct to collect all hook.* keys in a single config pass.
115 * commands: friendly-name to command map.
@@ -156,7 +148,7 @@ static int hook_config_lookup_all(const char *key, const char *value,
148 struct strmap_entry *e;
149
150 strmap_for_each_entry(&data->event_hooks, &iter, e)
159 - unsorted_string_list_remove(e->value, hook_name);
151 + unsorted_string_list_remove(e->value, hook_name, 0);
152 } else {
153 struct string_list *hooks =
154 strmap_get(&data->event_hooks, value);
@@ -168,7 +160,7 @@ static int hook_config_lookup_all(const char *key, const char *value,
160 }
161
162 /* Re-insert if necessary to preserve last-seen order. */
171 - unsorted_string_list_remove(hooks, hook_name);
163 + unsorted_string_list_remove(hooks, hook_name, 0);
164 string_list_append(hooks, hook_name);
165 }
166 } else if (!strcmp(subkey, "command")) {
@@ -186,7 +178,7 @@ static int hook_config_lookup_all(const char *key, const char *value,
178 break;
179 case 1: /* enabled: undo a prior disabled entry */
180 unsorted_string_list_remove(&data->disabled_hooks,
189 - hook_name);
181 + hook_name, 0);
182 break;
183 default:
184 break; /* ignore unrecognised values */
string-list.c
+9
@@ -281,6 +281,15 @@ void unsorted_string_list_delete_item(struct string_list *list, int i, int free_
281 list->nr--;
282 }
283
284 +void unsorted_string_list_remove(struct string_list *list, const char *str,
285 + int free_util)
286 +{
287 + struct string_list_item *item = unsorted_string_list_lookup(list, str);
288 + if (item)
289 + unsorted_string_list_delete_item(list, item - list->items,
290 + free_util);
291 +}
292 +
293 /*
294 * append a substring [p..end] to list; return number of things it
295 * appended to the list.
string-list.h
+8
@@ -265,6 +265,14 @@ struct string_list_item *unsorted_string_list_lookup(struct string_list *list,
265 */
266 void unsorted_string_list_delete_item(struct string_list *list, int i, int free_util);
267
268 +/**
269 + * Remove the first item matching `str` from an unsorted string_list.
270 + * No-op if `str` is not found. If `free_util` is non-zero, the `util`
271 + * pointer of the removed item is freed before deletion.
272 + */
273 +void unsorted_string_list_remove(struct string_list *list, const char *str,
274 + int free_util);
275 +
276 /**
277 * Split string into substrings on characters in `delim` and append the
278 * substrings to `list`. The input string is not modified.