diff options
| author | Patrick Steinhardt <ps@pks.im> | 2025-04-15 11:38:14 +0200 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2025-04-15 08:24:34 -0700 |
| commit | d1fa670de07ec9d08fc1333b3addf746c7d304e2 (patch) | |
| tree | d8f8e7b3edbddb66ed00a787e79594003cfed847 /path.c | |
| parent | Merge branch 'ps/object-wo-the-repository' into ps/object-file-cleanup (diff) | |
| download | git-d1fa670de07ec9d08fc1333b3addf746c7d304e2.tar.gz git-d1fa670de07ec9d08fc1333b3addf746c7d304e2.zip | |
object-file: move `mkdir_in_gitdir()` into "path.c"
The `mkdir_in_gitdir()` function is similar to `safe_create_dir()`, but
the former is hosted in "object-file.c" whereas the latter is hosted in
"path.c". The latter code unit makes way more sense though as the logic
has nothing to do with object files in particular.
Move the file into "path.c". While at it, we:
- Rename the function to `safe_create_dir_in_gitdir()` so that the
function names are similar to one another.
- Remove the dependency on `the_repository` by making the callers pass
the repository instead.
Adjust callers accordingly.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'path.c')
| -rw-r--r-- | path.c | 29 |
1 files changed, 29 insertions, 0 deletions
@@ -902,6 +902,35 @@ void safe_create_dir(struct repository *repo, const char *dir, int share) die(_("Could not make %s writable by group"), dir); } +int safe_create_dir_in_gitdir(struct repository *repo, const char *path) +{ + if (mkdir(path, 0777)) { + int saved_errno = errno; + struct stat st; + struct strbuf sb = STRBUF_INIT; + + if (errno != EEXIST) + return -1; + /* + * Are we looking at a path in a symlinked worktree + * whose original repository does not yet have it? + * e.g. .git/rr-cache pointing at its original + * repository in which the user hasn't performed any + * conflict resolution yet? + */ + if (lstat(path, &st) || !S_ISLNK(st.st_mode) || + strbuf_readlink(&sb, path, st.st_size) || + !is_absolute_path(sb.buf) || + mkdir(sb.buf, 0777)) { + strbuf_release(&sb); + errno = saved_errno; + return -1; + } + strbuf_release(&sb); + } + return adjust_shared_perm(repo, path); +} + static int have_same_root(const char *path1, const char *path2) { int is_abs1, is_abs2; |
