Hi Kvein,
On 2026-05-19T13:56:45+0800, Kevin J. McCarthy wrote:
> Revise it to use mutt_buffer_concat_path(), which was fixed in commit
> 048f4ae2.
> ---
>
> Derek Martin noticed this function was using an incorrect algorithm too.
>
> The function is only called in one place, mutt_complete() which handles
> command prompt completion of path.
>
> *** This commit, however does cause a CHANGE OF BEHAVIOR. ***
>
> When the dir part is empty, the old algorithm concatn_path combines:
> "" + "dir" => "dir"
>
> The new algorithm, now using mutt_buffer_concat_path, combines:
> "" + "dir" => "/dir"
>
> To see the change in mutt, start up mutt and
> - :unset folder<enter>
> - <change-folder>
> - At the prompt: Open mailbox ('?' for list):
> =usr/
> then hit Tab twice.
>
> Before this commit mutt will try to expand "usr" in your cwd.
> After this commit mutt will try to expand "/usr".
Doesn't = mean it's a relative path? Is it correct to interpret it as
/usr? I'm not very familiar with how these paths work, so I might be
completely wrong.
Have a lovely day!
Alex
>
> You can also see the difference if you start mutt from your homedir, and
> subsitute "usr/" for a directory in your homedir, such as "Documents/".
>
> This is an edge case, but I wanted to bring it up for discussion before
> making this change.
>
> muttlib.c | 20 +++++++++++++-------
> 1 file changed, 13 insertions(+), 7 deletions(-)
>
> diff --git a/muttlib.c b/muttlib.c
> index baef6038..df882002 100644
> --- a/muttlib.c
> +++ b/muttlib.c
> @@ -1421,19 +1421,25 @@ void mutt_buffer_concat_path(BUFFER *d, const char
> *dir, const char *fname)
> }
>
> /*
> - * Write the concatened pathname (dir + "/" + fname) into dst.
> - * The slash is omitted when dir or fname is of 0 length.
> + * Write the concatened pathname (dir + "/" + fname) into dst,
> + * respecting the size limits passed in.
> */
> void mutt_buffer_concatn_path(BUFFER *dst, const char *dir, size_t dirlen,
> const char *fname, size_t fnamelen)
> {
> - mutt_buffer_clear(dst);
> + BUFFER *dirbuf, *fnamebuf;
> +
> + dirbuf = mutt_buffer_pool_get();
> + fnamebuf = mutt_buffer_pool_get();
> +
> if (dirlen)
> - mutt_buffer_addstr_n(dst, dir, dirlen);
> - if (dirlen && fnamelen)
> - mutt_buffer_addch(dst, '/');
> + mutt_buffer_addstr_n(dirbuf, dir, dirlen);
> if (fnamelen)
> - mutt_buffer_addstr_n(dst, fname, fnamelen);
> + mutt_buffer_addstr_n(fnamebuf, fname, fnamelen);
> + mutt_buffer_concat_path(dst, mutt_b2s(dirbuf), mutt_b2s(fnamebuf));
> +
> + mutt_buffer_pool_release(&dirbuf);
> + mutt_buffer_pool_release(&fnamebuf);
> }
>
> const char *mutt_getcwd(BUFFER *cwd)
> --
> 2.54.0
>
--
<https://www.alejandro-colomar.es>
signature.asc
Description: PGP signature
