Reimplement async procedures using pthreads
[gitweb.git] / submodule.c
index ca0527fbcbdf4838a50956704148744630b65775..7d70c4f7bfe2749953726fecb27144a9588a326f 100644 (file)
@@ -10,17 +10,19 @@ static int add_submodule_odb(const char *path)
 {
        struct strbuf objects_directory = STRBUF_INIT;
        struct alternate_object_database *alt_odb;
+       int ret = 0;
 
        strbuf_addf(&objects_directory, "%s/.git/objects/", path);
-       if (!is_directory(objects_directory.buf))
-               return -1;
-
+       if (!is_directory(objects_directory.buf)) {
+               ret = -1;
+               goto done;
+       }
        /* avoid adding it twice */
        for (alt_odb = alt_odb_list; alt_odb; alt_odb = alt_odb->next)
                if (alt_odb->name - alt_odb->base == objects_directory.len &&
                                !strncmp(alt_odb->base, objects_directory.buf,
                                        objects_directory.len))
-                       return 0;
+                       goto done;
 
        alt_odb = xmalloc(objects_directory.len + 42 + sizeof(*alt_odb));
        alt_odb->next = alt_odb_list;
@@ -31,7 +33,9 @@ static int add_submodule_odb(const char *path)
        alt_odb->name[41] = '\0';
        alt_odb_list = alt_odb;
        prepare_alt_odb();
-       return 0;
+done:
+       strbuf_release(&objects_directory);
+       return ret;
 }
 
 void show_submodule_summary(FILE *f, const char *path,
@@ -126,7 +130,7 @@ int is_submodule_modified(const char *path)
                "--porcelain",
                NULL,
        };
-       char *env[3];
+       char *env[4];
        struct strbuf buf = STRBUF_INIT;
 
        strbuf_addf(&buf, "%s/.git/", path);
@@ -142,7 +146,9 @@ int is_submodule_modified(const char *path)
        env[0] = strbuf_detach(&buf, NULL);
        strbuf_addf(&buf, "GIT_DIR=%s/.git", path);
        env[1] = strbuf_detach(&buf, NULL);
-       env[2] = NULL;
+       strbuf_addf(&buf, "GIT_INDEX_FILE");
+       env[2] = strbuf_detach(&buf, NULL);
+       env[3] = NULL;
 
        memset(&cp, 0, sizeof(cp));
        cp.argv = argv;
@@ -161,6 +167,7 @@ int is_submodule_modified(const char *path)
 
        free(env[0]);
        free(env[1]);
+       free(env[2]);
        strbuf_release(&buf);
        return len != 0;
 }