Added suggestions from Eric and Junio. Interdiff to v5 below. Stefan Beller (3): submodule: Reimplement `module_list` shell function in C submodule: Reimplement `module_name` shell function in C submodule: Reimplement `module_clone` shell function in C .gitignore | 1 + Makefile | 1 + builtin.h | 1 + builtin/submodule--helper.c | 282 ++++++++++++++++++++++++++++++++++++++++++++ git-submodule.sh | 164 +++----------------------- git.c | 1 + 6 files changed, 301 insertions(+), 149 deletions(-) create mode 100644 builtin/submodule--helper.c diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c index 4e30d8e..f4c3eff 100644 --- a/builtin/submodule--helper.c +++ b/builtin/submodule--helper.c @@ -10,12 +10,16 @@ #include "string-list.h" #include "run-command.h" -static const struct cache_entry **ce_entries; -static int ce_alloc, ce_used; +struct module_list { + const struct cache_entry **entries; + int alloc, nr; +}; +#define MODULE_LIST_INIT { NULL, 0, 0 } static int module_list_compute(int argc, const char **argv, - const char *prefix, - struct pathspec *pathspec) + const char *prefix, + struct pathspec *pathspec, + struct module_list *list) { int i, result = 0; char *max_prefix, *ps_matched = NULL; @@ -40,12 +44,11 @@ static int module_list_compute(int argc, const char **argv, if (!S_ISGITLINK(ce->ce_mode) || !match_pathspec(pathspec, ce->name, ce_namelen(ce), - max_prefix_len, ps_matched, - S_ISGITLINK(ce->ce_mode) | S_ISDIR(ce->ce_mode))) + max_prefix_len, ps_matched, 1)) continue; - ALLOC_GROW(ce_entries, ce_used + 1, ce_alloc); - ce_entries[ce_used++] = ce; + ALLOC_GROW(list->entries, list->nr + 1, list->alloc); + list->entries[list->nr++] = ce; while (i + 1 < active_nr && !strcmp(ce->name, active_cache[i + 1]->name)) /* @@ -68,6 +71,7 @@ static int module_list(int argc, const char **argv, const char *prefix) { int i; struct pathspec pathspec; + struct module_list list = MODULE_LIST_INIT; struct option module_list_options[] = { OPT_STRING(0, "prefix", &prefix, @@ -84,13 +88,13 @@ static int module_list(int argc, const char **argv, const char *prefix) argc = parse_options(argc, argv, prefix, module_list_options, git_submodule_helper_usage, 0); - if (module_list_compute(argc, argv, prefix, &pathspec) < 0) { + if (module_list_compute(argc, argv, prefix, &pathspec, &list) < 0) { printf("#unmatched\n"); return 1; } - for (i = 0; i < ce_used; i++) { - const struct cache_entry *ce = ce_entries[i]; + for (i = 0; i < list.nr; i++) { + const struct cache_entry *ce = list.entries[i]; if (ce_stage(ce)) printf("%06o %s U\t", ce->ce_mode, sha1_to_hex(null_sha1)); @@ -142,10 +146,7 @@ static int clone_submodule(const char *path, const char *gitdir, const char *url cp.git_cmd = 1; cp.env = local_repo_env; - cp.no_stdin = 1; - cp.no_stdout = 1; - cp.no_stderr = 1; return run_command(&cp); } @@ -206,8 +207,7 @@ static int module_clone(int argc, const char **argv, const char *prefix) if (safe_create_leading_directories_const(path) < 0) die(_("could not create directory '%s'"), path); strbuf_addf(&sb, "%s/index", sm_gitdir); - if (unlink(sb.buf) < 0) - die_errno(_("failed to delete '%s'"), sm_gitdir); + unlink_or_warn(sb.buf); strbuf_reset(&sb); } @@ -218,7 +218,7 @@ static int module_clone(int argc, const char **argv, const char *prefix) if (path && *path) strbuf_addf(&sb, "%s/.git", path); else - strbuf_addf(&sb, ".git"); + strbuf_addstr(&sb, ".git"); if (safe_create_leading_directories_const(sb.buf) < 0) die(_("could not create leading directories of '%s'"), sb.buf); diff --git a/git-submodule.sh b/git-submodule.sh index 7cfdc2c..8b0eb9a 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -227,7 +227,7 @@ cmd_add() shift ;; --depth=*) - depth="$1" + depth=$1 ;; --) shift -- 2.5.0.256.g89f8063.dirty -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html