aboutsummaryrefslogtreecommitdiffstats
path: root/path.c
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2025-04-15 11:38:14 +0200
committerJunio C Hamano <gitster@pobox.com>2025-04-15 08:24:34 -0700
commitd1fa670de07ec9d08fc1333b3addf746c7d304e2 (patch)
treed8f8e7b3edbddb66ed00a787e79594003cfed847 /path.c
parentMerge branch 'ps/object-wo-the-repository' into ps/object-file-cleanup (diff)
downloadgit-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.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/path.c b/path.c
index 910756c8b3..c688f87458 100644
--- a/path.c
+++ b/path.c
@@ -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;