Documentation: git-add does not update files marked "assume unchanged"
[gitweb.git] / submodule.c
index f657bee379a6bc0fc7d6bd263c32e1b7e3e61efc..5d286e409ee2a9b12d6b64cb05394eca18fe3e97 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
@@ -116,16 +123,19 @@ void show_submodule_summary(FILE *f, const char *path,
 
 int is_submodule_modified(const char *path)
 {
-       int len;
+       int len, i;
        struct child_process cp;
        const char *argv[] = {
                "status",
                "--porcelain",
                NULL,
        };
-       char *env[3];
+       const char *env[LOCAL_REPO_ENV_SIZE + 3];
        struct strbuf buf = STRBUF_INIT;
 
+       for (i = 0; i < LOCAL_REPO_ENV_SIZE; i++)
+               env[i] = local_repo_env[i];
+
        strbuf_addf(&buf, "%s/.git/", path);
        if (!is_directory(buf.buf)) {
                strbuf_release(&buf);
@@ -136,14 +146,14 @@ int is_submodule_modified(const char *path)
        strbuf_reset(&buf);
 
        strbuf_addf(&buf, "GIT_WORK_TREE=%s", path);
-       env[0] = strbuf_detach(&buf, NULL);
+       env[i++] = strbuf_detach(&buf, NULL);
        strbuf_addf(&buf, "GIT_DIR=%s/.git", path);
-       env[1] = strbuf_detach(&buf, NULL);
-       env[2] = NULL;
+       env[i++] = strbuf_detach(&buf, NULL);
+       env[i] = NULL;
 
        memset(&cp, 0, sizeof(cp));
        cp.argv = argv;
-       cp.env = (const char *const *)env;
+       cp.env = env;
        cp.git_cmd = 1;
        cp.no_stdin = 1;
        cp.out = -1;
@@ -156,8 +166,8 @@ int is_submodule_modified(const char *path)
        if (finish_command(&cp))
                die("git status --porcelain failed");
 
-       free(env[0]);
-       free(env[1]);
+       for (i = LOCAL_REPO_ENV_SIZE; env[i]; i++)
+               free((char *)env[i]);
        strbuf_release(&buf);
        return len != 0;
 }