]> git.ipfire.org Git - thirdparty/git.git/commitdiff
get_superproject_working_tree(): return strbuf
authorAlexandr Miloslavskiy <alexandr.miloslavskiy@syntevo.com>
Tue, 10 Mar 2020 13:11:24 +0000 (13:11 +0000)
committerJunio C Hamano <gitster@pobox.com>
Tue, 10 Mar 2020 18:41:40 +0000 (11:41 -0700)
Together with the previous commits, this commit fully fixes the problem
of using shared buffer for `real_path()` in `get_superproject_working_tree()`.

Signed-off-by: Alexandr Miloslavskiy <alexandr.miloslavskiy@syntevo.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/rev-parse.c
submodule.c
submodule.h

index 06ca7175ac78879eab64ed24b22b12aeb87c10f8..06056434ed1f552ba70e1944718cc2fe79e434bc 100644 (file)
@@ -808,9 +808,10 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                                continue;
                        }
                        if (!strcmp(arg, "--show-superproject-working-tree")) {
-                               const char *superproject = get_superproject_working_tree();
-                               if (superproject)
-                                       puts(superproject);
+                               struct strbuf superproject = STRBUF_INIT;
+                               if (get_superproject_working_tree(&superproject))
+                                       puts(superproject.buf);
+                               strbuf_release(&superproject);
                                continue;
                        }
                        if (!strcmp(arg, "--show-prefix")) {
index 215c62580fc9fb5a474584475527490cbfc9427c..c3aadf3fff8c450c53a286c15f0b1528100779c1 100644 (file)
@@ -2168,14 +2168,13 @@ void absorb_git_dir_into_superproject(const char *path,
        }
 }
 
-const char *get_superproject_working_tree(void)
+int get_superproject_working_tree(struct strbuf *buf)
 {
-       static struct strbuf realpath = STRBUF_INIT;
        struct child_process cp = CHILD_PROCESS_INIT;
        struct strbuf sb = STRBUF_INIT;
        struct strbuf one_up = STRBUF_INIT;
        const char *cwd = xgetcwd();
-       const char *ret = NULL;
+       int ret = 0;
        const char *subpath;
        int code;
        ssize_t len;
@@ -2186,10 +2185,10 @@ const char *get_superproject_working_tree(void)
                 * We might have a superproject, but it is harder
                 * to determine.
                 */
-               return NULL;
+               return 0;
 
        if (!strbuf_realpath(&one_up, "../", 0))
-               return NULL;
+               return 0;
 
        subpath = relative_path(cwd, one_up.buf, &sb);
        strbuf_release(&one_up);
@@ -2233,8 +2232,8 @@ const char *get_superproject_working_tree(void)
                super_wt = xstrdup(cwd);
                super_wt[cwd_len - super_sub_len] = '\0';
 
-               strbuf_realpath(&realpath, super_wt, 1);
-               ret = realpath.buf;
+               strbuf_realpath(buf, super_wt, 1);
+               ret = 1;
                free(super_wt);
        }
        strbuf_release(&sb);
@@ -2243,10 +2242,10 @@ const char *get_superproject_working_tree(void)
 
        if (code == 128)
                /* '../' is not a git repository */
-               return NULL;
+               return 0;
        if (code == 0 && len == 0)
                /* There is an unrelated git repository at '../' */
-               return NULL;
+               return 0;
        if (code)
                die(_("ls-tree returned unexpected return code %d"), code);
 
index c81ec1a9b6c8ff3061c8119ad68b32f850314d9b..4dad649f94220e3897e629a5737da5f08705a5fb 100644 (file)
@@ -152,8 +152,8 @@ void absorb_git_dir_into_superproject(const char *path,
 /*
  * Return the absolute path of the working tree of the superproject, which this
  * project is a submodule of. If this repository is not a submodule of
- * another repository, return NULL.
+ * another repository, return 0.
  */
-const char *get_superproject_working_tree(void);
+int get_superproject_working_tree(struct strbuf *buf);
 
 #endif