Subject: Re: [PATCH] apply: strip ./ prefix from --directory argument

From: Patrick Steinhardt <[email-masked]>
Date: Tue, 17 Feb 2026 09:06:52 +0100

On Fri, Feb 13, 2026 at 05:08:30PM +0000, Joaquim Rocha via GitGitGadget wrote:
> From: Joaquim Rocha <[email-masked]>
> 
> When passing a relative path like --directory=./some/sub, the leading
> "./" caused apply to prepend it literally to patch filenames, resulting
> in an error (invalid path).
> 
> Since using "./" is almost memory muscle for many, strip the "./"
> prefix so it behaves the same as --directory=some/sub.

Isn't the problem wider than that though? For example, if you had
"././some/sub" it would break again. Or if you had "some/./sub", or
"some/sub/../sub", or "some//sub".

> diff --git a/apply.c b/apply.c
> index 3de4aa4d2e..a44c54077c 100644
> --- a/apply.c
> +++ b/apply.c
> @@ -5001,6 +5001,10 @@ static int apply_option_parse_directory(const struct option *opt,
>  	BUG_ON_OPT_NEG(unset);
>  
>  	strbuf_reset(&state->root);
> +
> +	if (starts_with(arg, "./"))
> +		arg += 2;
> +
>  	strbuf_addstr(&state->root, arg);
>  	strbuf_complete(&state->root, '/');
>  	return 0;

While this change here fixes your observed issues, the next person might
run into a totally different one. So more generally, I think what we'd
rather want to do is to fully normalize the path. How about this
instead:

diff --git a/apply.c b/apply.c
index 9de2eb953e..8946b133a3 100644
--- a/apply.c
+++ b/apply.c
@@ -5002,6 +5002,7 @@ static int apply_option_parse_directory(const struct option *opt,
 
 	strbuf_reset(&state->root);
 	strbuf_addstr(&state->root, arg);
+	strbuf_normalize_path(&state->root);
 	strbuf_complete(&state->root, '/');
 	return 0;
 }

`strbuf_normalize_path()` drops "." components, removes ".." and it
squashes multiple directory separators. So it handles your specific use
case, but also others.

Thanks!

Patrick