git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v4 0/7] string_list_split*() updates

From
Junio C Hamano <gitster@pobox.com>
Date
Aug 3, 2025, 06:52 UTC
Message-ID
<20250803065223.3325111-1-gitster@pobox.com>
In-Reply-To
<20250801220423.1230969-1-gitster@pobox.com>

Two related string-list API functions, string_list_split() and string_list_split_in_place(), more or less duplicates their implementations. They both take a single string, and split the string at the delimiter and stuff the result into a string list.

However, there is one subtle and unnecessary difference. The non "in-place" variant only allows a single byte value as delimiter, while the "in-place" variant can take multiple delimiters (e.g., "split at either a comma or a space").

This series first updates the string_list_split() to allow multiple delimiters like string_list_split_in_place() does, by unifying their implementations into one. This refactoring allows us to give new features to these two functions more easily.

Then these functions learn to optionally
 - trim the split string pieces before placing them in the resulting
   string list.
 - omit empty string pieces from the resulting string list.

An existing caller of string_list_split() in diff.c trims the elements in the resulting string list before it uses them, which is simplified by taking advantage of this new feature.

A handful of code paths call string_list_split*(), immediately followed by string_list_remove_empty_items(). They are simplified by not placing empty items in the list in the first place.

Relative to the v3 iteration, the v4 iteration explains the history behind string_list_split_in_place() in a bit more detail, and expands in-code comment to clarify what the verb "trim" means in the context of STRING_LIST_SPLIT_TRIM.

Junio C Hamano (7):
  string-list: report programming error with BUG
  string-list: align string_list_split() with its _in_place()
    counterpart
  string-list: unify string_list_split* functions
  string-list: optionally trim string pieces split by
    string_list_split*()
  diff: simplify parsing of diff.colormovedws
  string-list: optionally omit empty string pieces in
    string_list_split*()
  string-list: split-then-remove-empty can be done while splitting
 builtin/blame.c              |   2 +-
 builtin/merge.c              |   2 +-
 builtin/var.c                |   2 +-
 connect.c                    |   2 +-
 diff.c                       |  20 ++----
 fetch-pack.c                 |   2 +-
 notes.c                      |   6 +-
 parse-options.c              |   2 +-
 pathspec.c                   |   3 +-
 protocol.c                   |   2 +-
 ref-filter.c                 |   4 +-
 setup.c                      |   3 +-
 string-list.c                | 120 ++++++++++++++++++++++++-----------
 string-list.h                |  33 +++++++---
 t/helper/test-hashmap.c      |   4 +-
 t/helper/test-json-writer.c  |   4 +-
 t/helper/test-path-utils.c   |   3 +-
 t/helper/test-ref-store.c    |   2 +-
 t/unit-tests/u-string-list.c |  95 ++++++++++++++++++++++++---
 transport.c                  |   2 +-
 upload-pack.c                |   2 +-
 21 files changed, 225 insertions(+), 90 deletions(-)
Range-diff against v3:
1:  442ed679bb = 1:  4f9c8d8963 string-list: report programming error with BUG
2:  cc80bac8c2 ! 2:  9f6dfe43c8 string-list: align string_list_split() with its _in_place() counterpart
    @@ Metadata
      ## Commit message ##
         string-list: align string_list_split() with its _in_place() counterpart
     
    -    For some unknown reason, unlike string_list_split_in_place(),
    -    string_list_split() took only a single character as a field
    -    delimiter.  Before giving both functions more features in future
    -    commits, allow string_list_split() to take more than one delimiter
    -    characters to make them closer to each other.
    +    The string_list_split_in_place() function was updated by 52acddf3
    +    (string-list: multi-delimiter `string_list_split_in_place()`,
    +    2023-04-24) to take more than one delimiter characters, hoping that
    +    we can later use it to replace our uses of strtok().  We however did
    +    not make a matching change to the string_list_split() function,
    +    which is very similar.
    +
    +    Before giving both functions more features in future commits, allow
    +    string_list_split() to also take more than one delimiter characters
    +    to make them closer to each other.
     
         Signed-off-by: Junio C Hamano <gitster@pobox.com>
     
3:  c7922b3e14 = 3:  527535fcdd string-list: unify string_list_split* functions
4:  9d7d22e8ef ! 4:  5764549741 string-list: optionally trim string pieces split by string_list_split*()
    @@ string-list.h: int string_list_split(struct string_list *list, const char *strin
      int string_list_split_in_place(struct string_list *list, char *string,
      			       const char *delim, int maxsplit);
     +
    -+/* flag bits for split_f and split_in_place_f functions */
    ++/* Flag bits for split_f and split_in_place_f functions */
     +enum {
    -+	/* trim() resulting string piece before adding it to the list */
    ++	/*
    ++	 * trim whitespaces around resulting string piece before adding
    ++	 * it to the list
    ++	 */
     +	STRING_LIST_SPLIT_TRIM = (1 << 0),
     +};
     +
5:  ad8b425bc5 = 5:  f3a303aef0 diff: simplify parsing of diff.colormovedws
6:  d03f443878 ! 6:  27531efa41 string-list: optionally omit empty string pieces in string_list_split*()
    @@ string-list.c: static int append_one(struct string_list *list,
      		string_list_append(list, p);
     
      ## string-list.h ##
    -@@ string-list.h: int string_list_split_in_place(struct string_list *list, char *string,
    - enum {
    - 	/* trim() resulting string piece before adding it to the list */
    +@@ string-list.h: enum {
    + 	 * it to the list
    + 	 */
      	STRING_LIST_SPLIT_TRIM = (1 << 0),
     +	/* omit adding empty string piece to the resulting list */
     +	STRING_LIST_SPLIT_NONEMPTY = (1 << 1),
7:  9eb8d87d62 = 7:  2ab2aac73d string-list: split-then-remove-empty can be done while splitting
-- 
2.50.1-633-g69dfdd50af
Previous: Junio C HamanoNext: Junio C Hamano
Message 51 of 72 in “string_list_split*() updates”
  1. 0/5 string_list_split*() updatesJunio C Hamano, Jul 31, 2025
  2. 1/5 string-list: report programming error with BUGJunio C Hamano, Jul 31, 2025
  3. Eric SunshineJul 31, 2025
  4. Junio C HamanoJul 31, 2025
  5. 2/5 string-list: align string_list_split() with its _in_place() counterpartJunio C Hamano, Jul 31, 2025
  6. Eric SunshineJul 31, 2025
  7. 3/5 string-list: unify string_list_split* functionsJunio C Hamano, Jul 31, 2025
  8. 4/5 string-list: optionally trim string pieces split by string_list_split()Junio C Hamano, Jul 31, 2025
  9. 5/5 diff: simplify parsing of diff.colormovedwsJunio C Hamano, Jul 31, 2025
  10. Eric SunshineJul 31, 2025
  11. 0/7 string_list_split*() updatesJunio C Hamano, Jul 31, 2025
  12. 1/7 string-list: report programming error with BUGJunio C Hamano, Jul 31, 2025
  13. 2/7 string-list: align string_list_split() with its _in_place() counterpartJunio C Hamano, Jul 31, 2025
  14. shejialuoAug 1, 2025
  15. Junio C HamanoAug 1, 2025
  16. shejialuoAug 1, 2025
  17. Junio C HamanoAug 1, 2025
  18. 3/7 string-list: unify string_list_split* functionsJunio C Hamano, Jul 31, 2025
  19. shejialuoAug 1, 2025
  20. 4/7 string-list: optionally trim string pieces split by string_list_split*()Junio C Hamano, Jul 31, 2025
  21. shejialuoAug 1, 2025
  22. Junio C HamanoAug 1, 2025
  23. shejialuoAug 1, 2025
  24. Junio C HamanoAug 1, 2025
  25. shejialuoAug 2, 2025
  26. Patrick SteinhardtAug 1, 2025
  27. Junio C HamanoAug 1, 2025
  28. 5/7 diff: simplify parsing of diff.colormovedwsJunio C Hamano, Jul 31, 2025
  29. Patrick SteinhardtAug 1, 2025
  30. 6/7 string-list: optionally omit empty string pieces in string_list_split*()Junio C Hamano, Jul 31, 2025
  31. Eric SunshineJul 31, 2025
  32. shejialuoAug 1, 2025
  33. Patrick SteinhardtAug 1, 2025
  34. Junio C HamanoAug 1, 2025
  35. 7/7 string-list: split-then-remove-empty can be done while splittingJunio C Hamano, Jul 31, 2025
  36. Patrick SteinhardtAug 1, 2025
  37. 0/7 string_list_split*() updatesJunio C Hamano, Aug 1, 2025
  38. 1/7 string-list: report programming error with BUGJunio C Hamano, Aug 1, 2025
  39. 2/7 string-list: align string_list_split() with its _in_place() counterpartJunio C Hamano, Aug 1, 2025
  40. Jeff KingAug 2, 2025
  41. Junio C HamanoAug 2, 2025
  42. Jeff KingAug 2, 2025
  43. 3/7 string-list: unify string_list_split* functionsJunio C Hamano, Aug 1, 2025
  44. 4/7 string-list: optionally trim string pieces split by string_list_split*()Junio C Hamano, Aug 1, 2025
  45. Jeff KingAug 2, 2025
  46. Junio C HamanoAug 2, 2025
  47. Jeff KingAug 2, 2025
  48. 5/7 diff: simplify parsing of diff.colormovedwsJunio C Hamano, Aug 1, 2025
  49. 6/7 string-list: optionally omit empty string pieces in string_list_split*()Junio C Hamano, Aug 1, 2025
  50. 7/7 string-list: split-then-remove-empty can be done while splittingJunio C Hamano, Aug 1, 2025
  51. 0/7 string_list_split*() updatesJunio C Hamano, Aug 3, 2025
  52. 1/7 string-list: report programming error with BUGJunio C Hamano, Aug 3, 2025
  53. 2/7 string-list: align string_list_split() with its _in_place() counterpartJunio C Hamano, Aug 3, 2025
  54. 3/7 string-list: unify string_list_split* functionsJunio C Hamano, Aug 3, 2025
  55. 4/7 string-list: optionally trim string pieces split by string_list_split*()Junio C Hamano, Aug 3, 2025
  56. 5/7 diff: simplify parsing of diff.colormovedwsJunio C Hamano, Aug 3, 2025
  57. 6/7 string-list: optionally omit empty string pieces in string_list_split*()Junio C Hamano, Aug 3, 2025
  58. 7/7 string-list: split-then-remove-empty can be done while splittingJunio C Hamano, Aug 3, 2025
  59. Patrick SteinhardtAug 4, 2025
  60. 00/12 do not overuse strbuf_split*()Junio C Hamano, Aug 3, 2025
  61. 01/12 wt-status: avoid strbuf_split*()Junio C Hamano, Aug 3, 2025
  62. 02/12 clean: do not pass strbuf by valueJunio C Hamano, Aug 3, 2025
  63. 03/12 clean: do not use strbuf_split*() [part 1]Junio C Hamano, Aug 3, 2025
  64. 04/12 clean: do not pass the whole structure when it is not necessaryJunio C Hamano, Aug 3, 2025
  65. 05/12 clean: do not use strbuf_split*() [part 2]Junio C Hamano, Aug 3, 2025
  66. 06/12 merge-tree: do not use strbuf_split*()Junio C Hamano, Aug 3, 2025
  67. 07/12 notes: do not use strbuf_split*()Junio C Hamano, Aug 3, 2025
  68. 08/12 config: do not use strbuf_split()Junio C Hamano, Aug 3, 2025
  69. 09/12 environment: do not use strbuf_split*()Junio C Hamano, Aug 3, 2025
  70. 10/12 sub-process: do not use strbuf_split*()Junio C Hamano, Aug 3, 2025
  71. 11/12 trace2: trim_trailing_newline followed by trim is a no-opJunio C Hamano, Aug 3, 2025
  72. 12/12 trace2: do not use strbuf_split*()Junio C Hamano, Aug 3, 2025

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.