Re: [PATCH] apply: strip ./ prefix from --directory argument
From: Patrick Steinhardt <hidden>
Date: 2026-02-17 08:06:59
Subsystem:
the rest · Maintainer:
Linus Torvalds
On Fri, Feb 13, 2026 at 05:08:30PM +0000, Joaquim Rocha via GitGitGadget wrote:
From: Joaquim Rocha <redacted> 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".
quoted hunk ↗ jump to hunk
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