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

Re: [PATCH v2 3/4] strbuf: make add_lines() public

From
Junio C Hamano <gitster@pobox.com>
Date
Nov 1, 2023, 04:14 UTC
Message-ID
<xmqq5y2mun2y.fsf@gitster.g>
In-Reply-To
<283f502acb68910cb43d6077eef99d6345aaea4b.1698791220.git.jonathantanmy@google.com>
Jonathan Tan <jonathantanmy@google.com> writes:
Show 22 quoted lines
> -static void add_lines(struct strbuf *out,
> -			const char *prefix1,
> -			const char *prefix2,
> -			const char *buf, size_t size)
> +void strbuf_add_lines_varied_prefix(struct strbuf *sb,
> +				    const char *default_prefix,
> +				    const char *tab_nl_prefix,
> +				    const char *buf, size_t size)
>  {
>  	while (size) {
>  		const char *prefix;
>  		const char *next = memchr(buf, '\n', size);
>  		next = next ? (next + 1) : (buf + size);
>  
> -		prefix = ((prefix2 && (buf[0] == '\n' || buf[0] == '\t'))
> -			  ? prefix2 : prefix1);
> -		strbuf_addstr(out, prefix);
> -		strbuf_add(out, buf, next - buf);
> +		prefix = (buf[0] == '\n' || buf[0] == '\t')
> +			  ? tab_nl_prefix : default_prefix;
> +		strbuf_addstr(sb, prefix);
> +		strbuf_add(sb, buf, next - buf);

The original allowed callers to pass NULL for the second prefix when they want to use the same prefix, even for commenting out an empty line or a line that begins with a tab. The new one does not allow the callers to do so. As long as updating the existing callers are done carefully, the difference would not matter, but would it help new callers in the future to rid the usability feature like this patch does while performing a refactoring? The loss of feature is not even documented, by the way.

While "tab_nl" sound a bit more specific than "2", I am not sure if we made it better. It does not make it clear why it makes sense to (and it is necessary to) special case HT and LF. A developer who is writing a new caller would not know why there are two prefixes supported, or why the function is named "varied prefix", with these names.

Giving a name that explains the reason might help the readability. I've been thinking what the best name for this function would be but not successfully.

It may be that we shouldn't take two prefixes in the first place. The ONLY case callers want to pass prefix2 that is different from prefix1 is when prefix1 ends with a space, and prefix2 is identical to prefix1 without the trailing space. The reason they use such a pair of prefixes is to avoid leaving a trailing whitespace (when buf[0] == '\n') or having a space before tab (when buf[0] == '\t') on the generated lines.

So eventually we may want to have something like this as the final interface given to the public callers, simply because ...

    strbuf_add_lines_as_comments(struct strbuf *sb,
			         const char *comment_prefix,
				 const char *buf, size_t size)
    {
	while (size) {
            const char *next = memchr(buf, '\n', size);
	    next = next ? (next + 1) : (buf + size);
	    strbuf_addstr(sb, comment_prefix);
	    /* avoid trailing-whitespace and space-before-tab */
	    if (buf[0] != '\n' && buf[0] != '\t')
 		strbuf_addch(sb, ' ');
	    strbuf_add(sb, buf, next - buf);
	    ... loop control ...
	}
        ... strbuf completion ...
    }

... there is no need for totally unrelated two prefix variants. And both the function name and the parameter name would be a bit easier to understand than your version (and far easier than the original). The function is about commenting out all the lines in buf with the comment prefix, and most of the time we add a space between the comment character and the commented out text, but in some cases we do not want to add the space.

But as I said already, I'd prefer to see a patch that claims to be a refactoring to do as little as necessary. Giving it a name better than add_lines() is inevitable, because you are making it extern. But I'd prefer to see the parameter naems and the function body left untouched and kept the same as the original. It should be left to a separate step to improve the interface and the implementation.

Thanks.
Previous: Jonathan TanNext: Jonathan Tan
Message 19 of 21 in “Avoid passing global comment_line_char repeatedly”
  1. 0/2 Avoid passing global comment_line_char repeatedlyJunio C Hamano, Oct 30, 2023
  2. 1/2 strbuf_commented_addf(): drop the comment_line_char parameterJunio C Hamano, Oct 30, 2023
  3. 2/2 strbuf_add_commented_lines(): drop the comment_line_char parameterJunio C Hamano, Oct 30, 2023
  4. Dragan SimicOct 30, 2023
  5. Phillip WoodOct 30, 2023
  6. 0/3 Avoid passing global comment_line_char repeatedlyJonathan Tan, Oct 30, 2023
  7. 1/3 strbuf: make add_lines() publicJonathan Tan, Oct 30, 2023
  8. Junio C HamanoOct 30, 2023
  9. Junio C HamanoOct 31, 2023
  10. 2/3 strbuf_commented_addf(): drop the comment_line_char parameterJonathan Tan, Oct 30, 2023
  11. Junio C HamanoOct 31, 2023
  12. Jonathan TanOct 31, 2023
  13. Junio C HamanoOct 31, 2023
  14. 3/3 strbuf_add_commented_lines(): drop the comment_line_char parameterJonathan Tan, Oct 30, 2023
  15. 0/4 Avoid passing global comment_line_char repeatedlyJonathan Tan, Oct 31, 2023
  16. 1/4 strbuf_commented_addf(): drop the comment_line_char parameterJonathan Tan, Oct 31, 2023
  17. 2/4 strbuf_add_commented_lines(): drop the comment_line_char parameterJonathan Tan, Oct 31, 2023
  18. 3/4 strbuf: make add_lines() publicJonathan Tan, Oct 31, 2023
  19. Junio C HamanoNov 1, 2023
  20. 4/4 strbuf: move env-using functions to environment.cJonathan Tan, Oct 31, 2023
  21. Junio C HamanoNov 1, 2023

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.