fetch and pull: learn --progress
[gitweb.git] / submodule.c
index f657bee379a6bc0fc7d6bd263c32e1b7e3e61efc..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,11 +33,14 @@ 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,
                unsigned char one[20], unsigned char two[20],
+               unsigned dirty_submodule,
                const char *del, const char *add, const char *reset)
 {
        struct rev_info rev;
@@ -85,6 +90,8 @@ void show_submodule_summary(FILE *f, const char *path,
        if (!fast_backward && !fast_forward)
                strbuf_addch(&sb, '.');
        strbuf_addf(&sb, "%s", find_unique_abbrev(two, DEFAULT_ABBREV));
+       if (dirty_submodule)
+               strbuf_add(&sb, "-dirty", 6);
        if (message)
                strbuf_addf(&sb, " %s\n", message);
        else
@@ -123,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);
@@ -139,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;
@@ -158,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;
 }