]> git.ipfire.org Git - thirdparty/git.git/commitdiff
object-file: move `mkdir_in_gitdir()` into "path.c"
authorPatrick Steinhardt <ps@pks.im>
Tue, 15 Apr 2025 09:38:14 +0000 (11:38 +0200)
committerJunio C Hamano <gitster@pobox.com>
Tue, 15 Apr 2025 15:24:34 +0000 (08:24 -0700)
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>
builtin/rebase.c
object-file.c
object-file.h
path.c
path.h
rerere.c

index 1cd802dd92a53d812a1eb82c017eddc4e1431f86..cd9371536f87f31eff185d6f34b6f92798edb061 100644 (file)
@@ -267,7 +267,8 @@ static int init_basic_state(struct replay_opts *opts, const char *head_name,
 {
        FILE *interactive;
 
-       if (!is_directory(merge_dir()) && mkdir_in_gitdir(merge_dir()))
+       if (!is_directory(merge_dir()) &&
+           safe_create_dir_in_gitdir(the_repository, merge_dir()))
                return error_errno(_("could not create temporary %s"), merge_dir());
 
        refs_delete_reflog(get_main_ref_store(the_repository), "REBASE_HEAD");
index 772c311f188a222ad8f3e90104f2c3065deab8a0..00451876bd05cf1ee659df4504f0f34a56f3848d 100644 (file)
@@ -90,36 +90,6 @@ static int get_conv_flags(unsigned flags)
                return 0;
 }
 
-
-int mkdir_in_gitdir(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(the_repository, path);
-}
-
 static enum scld_error safe_create_leading_directories_1(char *path, int share)
 {
        char *next_component = path + offset_1st_component(path);
@@ -2196,7 +2166,8 @@ int stream_loose_object(struct input_stream *in_stream, size_t len,
                struct strbuf dir = STRBUF_INIT;
                strbuf_add(&dir, filename.buf, dirlen);
 
-               if (mkdir_in_gitdir(dir.buf) && errno != EEXIST) {
+               if (safe_create_dir_in_gitdir(the_repository, dir.buf) &&
+                   errno != EEXIST) {
                        err = error_errno(_("unable to create directory %s"), dir.buf);
                        strbuf_release(&dir);
                        goto cleanup;
index 81b30d269c82e4cfb4d1b53dc1511c12e5cda608..4649a3f37d4da93b766907832185218f94340639 100644 (file)
@@ -54,8 +54,6 @@ enum scld_error safe_create_leading_directories(char *path);
 enum scld_error safe_create_leading_directories_const(const char *path);
 enum scld_error safe_create_leading_directories_no_share(char *path);
 
-int mkdir_in_gitdir(const char *path);
-
 int git_open_cloexec(const char *name, int flags);
 #define git_open(name) git_open_cloexec(name, O_RDONLY)
 
diff --git a/path.c b/path.c
index 910756c8b3249c5306c0bd4c45d5172ba04b9da0..c688f87458029328e5b24baf86fa2bcd7a42e5b8 100644 (file)
--- 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;
diff --git a/path.h b/path.h
index 65fe968a13a191fea16dfab879faa9be18653cf5..a427516d818429abb6911bd822baba13ce928c9b 100644 (file)
--- a/path.h
+++ b/path.h
@@ -221,6 +221,17 @@ char *xdg_cache_home(const char *filename);
  */
 void safe_create_dir(struct repository *repo, const char *dir, int share);
 
+/*
+ * Similar to `safe_create_dir()`, but with two differences:
+ *
+ *   - It knows to resolve gitlink files for symlinked worktrees.
+ *
+ *   - It always adjusts shared permissions.
+ *
+ * Returns a negative erorr code on error, 0 on success.
+ */
+int safe_create_dir_in_gitdir(struct repository *repo, const char *path);
+
 # ifdef USE_THE_REPOSITORY_VARIABLE
 #  include "strbuf.h"
 #  include "repository.h"
index 740e8ad1a0b40ab4c94d369bf346613d34fa0998..0832cc54840a950ea959173fea9a33d21422e14c 100644 (file)
--- a/rerere.c
+++ b/rerere.c
@@ -860,7 +860,7 @@ static int do_plain_rerere(struct repository *r,
                string_list_insert(rr, path)->util = id;
 
                /* Ensure that the directory exists. */
-               mkdir_in_gitdir(rerere_path(&buf, id, NULL));
+               safe_create_dir_in_gitdir(the_repository, rerere_path(&buf, id, NULL));
        }
 
        for (i = 0; i < rr->nr; i++)
@@ -895,7 +895,8 @@ static int is_rerere_enabled(void)
        if (rerere_enabled < 0)
                return rr_cache_exists;
 
-       if (!rr_cache_exists && mkdir_in_gitdir(git_path_rr_cache()))
+       if (!rr_cache_exists &&
+           safe_create_dir_in_gitdir(the_repository, git_path_rr_cache()))
                die(_("could not create directory '%s'"), git_path_rr_cache());
        return 1;
 }