[PATCH v2 2/7] path: introduce `safe_create_leading_directories_no_share_const()`
- From
Patrick Steinhardt <ps@pks.im>
- Date
- Sep 28, 2026, 09:51 UTC
- Message-ID
- <20260928-pks-create-repository-stateless-v2-2-a03612f703fa@pks.im>
- In-Reply-To
- <20260928-pks-create-repository-stateless-v2-0-a03612f703fa@pks.im>
The `safe_create_leading_directories()` family of functions modify the passed-in path so that we can obtain all the different segments of the path. This is done by overwriting path separators with a NUL byte for every component. While we ultimately restore the original string, the consequence is that the caller needs to pass a non-constant string.
While it would be trivial to modify the function to not modify the path in-place anymore, the intent of this whole mechanism is to save an allocation. It's quite dubious whether this optimization really matters in the grand scheme of things, but here we are.
In any case, we provide a `_const()` variant that handles the case where the caller only has a string constant. But we lack such a variant for the `safe_create_leading_directories_no_share()` function, and we're about to add a couple of callers that would need it.
Add this helper function.
Signed-off-by: Patrick Steinhardt <ps@pks.im> --- path.c | 5 +++++ path.h | 14 ++++++-------- 2 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/path.c b/path.c index 69b06c9464..f8f5a9dd28 100644 --- a/path.c +++ b/path.c @@ -889,6 +889,11 @@ enum scld_error safe_create_leading_directories_no_share(char *path) return safe_create_leading_directories(NULL, path); } +enum scld_error safe_create_leading_directories_no_share_const(const char *path) +{ + return safe_create_leading_directories_const(NULL, path); +} + enum scld_error safe_create_leading_directories_const(struct repository *repo, const char *path) { diff --git a/path.h b/path.h index 7e7408dd05..922bd6e377 100644 --- a/path.h +++ b/path.h @@ -234,14 +234,11 @@ int safe_create_dir_in_gitdir(struct repository *repo, const char *path); * race, callers might want to try invoking the function again when it * returns SCLD_VANISHED. * - * safe_create_leading_directories() temporarily changes path while it - * is working but restores it before returning. - * safe_create_leading_directories_const() doesn't modify path, even - * temporarily. Both these variants adjust the permissions of the - * created directories to honor core.sharedRepository, so they are best - * suited for files inside the git dir. For working tree files, use - * safe_create_leading_directories_no_share() instead, as it ignores - * the core.sharedRepository setting. + * The default variants honor "core.sharedRepository" and temporarily modify + * `path`. Note that this configuration should be honored for all files in the + * git directory. The `no_share()` variants ignore "core.sharedRepository", + * and should be used for working tree files. The `const()` variants do not + * modify `path`. */ enum scld_error { SCLD_OK = 0, @@ -254,6 +251,7 @@ enum scld_error safe_create_leading_directories(struct repository *repo, char *p enum scld_error safe_create_leading_directories_const(struct repository *repo, const char *path); enum scld_error safe_create_leading_directories_no_share(char *path); +enum scld_error safe_create_leading_directories_no_share_const(const char *path); /* * Create a file, potentially creating its leading directories in case they
-- 2.56.0.rc2.329.gd58861e689.dirty