From: Junio C Hamano <gitster@pobox.com>
To: "Md Isfarul Haque via GitGitGadget" <gitgitgadget@gmail.com>
Cc: git@vger.kernel.org, Md Isfarul Haque <isfarul.876@gmail.com>
Subject: Re: [PATCH 1/2] FIX: use utf8_strnwidth for line_prefix in diff.c
Date: Wed, 24 Jan 2024 12:08:02 -0800 [thread overview]
Message-ID: <xmqqplxqcx5p.fsf@gitster.g> (raw)
In-Reply-To: <ac9338533c9096c090d1463c1b29505bde019731.1706105064.git.gitgitgadget@gmail.com> (Md Isfarul Haque via GitGitGadget's message of "Wed, 24 Jan 2024 14:04:23 +0000")
"Md Isfarul Haque via GitGitGadget" <gitgitgadget@gmail.com> writes:
> From: Md Isfarul Haque <isfarul.876@gmail.com>
>
> This patch adresses diff.c:2721 and proposes the fix using a new function.
Once the issue has fully been addressed, it is expected that the
NEEDSWORK comment there would be removed, making this proposed log
message useless. Make it a habit to write a log message that is
self-contained enough to help readers (including yourself in the
future when you have forgotten the details of what you did in this
commit).
> +const struct strbuf *diff_line_prefix_buf(struct diff_options *opt)
> +{
Given that there is only one caller of this function in the same
file, I do not see a reason why this needs to be extern and exported
in diff.h (actually I do not see a need for this helper at all).
When dealing with a string buffer, it is much more common in this
codebase for the caller to prepare a strbuf (often on its stack) and
pass a pointer to it to helper functions. I.e.
static void prepare_diff_line_prefix_buf(struct strbuf *buf,
struct diff_options *opt)
{
... stuff whatever you need into the string buffer ...
strbuf_add(buf, ...);
}
/* in show_stats() */
struct strbuf line_prefix = STRBUF_INIT;
...
prepare_diff_line_prefix_buf(&line_prefix, options);
... use line_prefix and ...
... release the resource before returning ...
strbuf_release(&line_prefix);
is more common and less prone to resource leak over time.
> @@ -2635,7 +2649,7 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options)
> int width, name_width, graph_width, number_width = 0, bin_width = 0;
> const char *reset, *add_c, *del_c;
> int extra_shown = 0;
> - const char *line_prefix = diff_line_prefix(options);
> + const struct strbuf *line_prefix = diff_line_prefix_buf(options);
> struct strbuf out = STRBUF_INIT;
>
> if (data->nr == 0)
> @@ -2718,7 +2732,7 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options)
> * used to correctly count the display width instead of strlen().
> */
> if (options->stat_width == -1)
> - width = term_columns() - strlen(line_prefix);
> + width = term_columns() - utf8_strnwidth(line_prefix->buf, line_prefix->len, 1);
I do not see the need for any of the diff_line_prefix_buf() related
changes, only to do this change. You have a const char *line_prefix
at this point, and utf8_strnwidth() wants to know its length, so
what you need is to massage the parameter to match what it wants.
Perhaps even something simple and dumb like
utf8_strnwidth(line_prefix, strlen(line_prefix), 1);
might be sufficient to replace strlen(line_prefix) in the original?
This patch hopefully will change the behaviour of the command. A
patch needs to also protect the change from future breakages by
adding a test or two to demonstrate the desired behaviour. Such a
test should pass with the code change in the patch, and should fail
when the code change in the patch gets reverted.
Thanks.
next prev parent reply other threads:[~2024-01-24 20:08 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-24 14:04 [PATCH 0/2] [GSoC][RFC/Patch] FIX: use utf8_strnwidth for line_prefix in diff.c Md Isfarul Haque via GitGitGadget
2024-01-24 14:04 ` [PATCH 1/2] " Md Isfarul Haque via GitGitGadget
2024-01-24 20:01 ` Christian Couder
2024-01-25 5:42 ` Md Isfarul Haque
2024-01-24 20:08 ` Junio C Hamano [this message]
2024-01-25 5:52 ` Md Isfarul Haque
2024-01-24 14:04 ` [PATCH 2/2] FIX memory leak in one branch Md Isfarul Haque via GitGitGadget
2024-01-24 20:11 ` Junio C Hamano
2024-01-24 17:42 ` [PATCH 0/2] [GSoC][RFC/Patch] FIX: use utf8_strnwidth for line_prefix in diff.c 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=xmqqplxqcx5p.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
--cc=isfarul.876@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.