From: Patrick Steinhardt Date: Tue, 17 Feb 2026 08:06:52 GMT Subject: Re: [PATCH] apply: strip ./ prefix from --directory argument Message-ID: In-Reply-To: On Fri, Feb 13, 2026 at 05:08:30PM +0000, Joaquim Rocha via GitGitGadget wrote: > From: Joaquim Rocha > > 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