diff options
Diffstat (limited to 'submodule.c')
| -rw-r--r-- | submodule.c | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/submodule.c b/submodule.c index f657bee379..5d286e409e 100644 --- a/submodule.c +++ b/submodule.c @@ -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; } |
