On Tue, Sep 1, 2015 at 2:24 PM, Stefan Beller <sbeller@xxxxxxxxxx> wrote: > This converts implements the helper `module_clone`. This functionality is Mentioned previously[1]: "converts implements"? [1]: http://article.gmane.org/gmane.comp.version-control.git/276966 > needed for converting `git submodule update` later on, which we want to > add threading to. > > Signed-off-by: Stefan Beller <sbeller@xxxxxxxxxx> > --- > diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c > index f5e408a..63f535a 100644 > --- a/builtin/submodule--helper.c > +++ b/builtin/submodule--helper.c > +static int module_clone(int argc, const char **argv, const char *prefix) > +{ > + const char *path = NULL, *name = NULL, *url = NULL; > + const char *reference = NULL, *depth = NULL; > + const char *alternative_path = NULL, *p; > + int quiet = 0; > + FILE *submodule_dot_git; > + char *sm_gitdir; > + struct strbuf rel_path = STRBUF_INIT; > + struct strbuf sb = STRBUF_INIT; > + > + struct option module_clone_options[] = { > + OPT_STRING(0, "prefix", &alternative_path, > + N_("path"), > + N_("alternative anchor for relative paths")), > + OPT_STRING(0, "path", &path, > + N_("path"), > + N_("where the new submodule will be cloned to")), > + OPT_STRING(0, "name", &name, > + N_("string"), > + N_("name of the new submodule")), > + OPT_STRING(0, "url", &url, > + N_("string"), > + N_("url where to clone the submodule from")), > + OPT_STRING(0, "reference", &reference, > + N_("string"), > + N_("reference repository")), > + OPT_STRING(0, "depth", &depth, > + N_("string"), > + N_("depth for shallow clones")), > + OPT__QUIET(&quiet, "Suppress output for cloning a submodule"), > + OPT_END() > + }; > + > + const char * const git_submodule_helper_usage[] = { Style: *const > + N_("git submodule--helper clone [--prefix=<path>] [--quiet] " > + "[--reference <repository>] [--name <name>] [--url <url>]" > + "[--depth <depth>] [--] [<path>...]"), > + NULL > + }; > + > + argc = parse_options(argc, argv, prefix, module_clone_options, > + git_submodule_helper_usage, 0); > + > + strbuf_addf(&sb, "%s/modules/%s", get_git_dir(), name); > + sm_gitdir = strbuf_detach(&sb, NULL); > + > + if (!file_exists(sm_gitdir)) { > + if (safe_create_leading_directories_const(sm_gitdir) < 0) > + die(_("could not create directory '%s'"), sm_gitdir); > + if (clone_submodule(path, sm_gitdir, url, depth, reference, quiet)) > + die(N_("clone of '%s' into submodule path '%s' failed"), > + url, path); s/N_/_/ > + } else { > + if (safe_create_leading_directories_const(path) < 0) > + die(_("could not create directory '%s'"), path); > + if (unlink(sm_gitdir) < 0) > + die_errno(_("failed to delete '%s'"), sm_gitdir); > + } > + > + /* Write a .git file in the submodule to redirect to the superproject. */ > + if (alternative_path && *alternative_path)) { > + p = relative_path(path, alternative_path, &sb); > + strbuf_reset(&sb); > + } else > + p = path; > + > + if (safe_create_leading_directories_const(p) < 0) > + die(_("could not create directory '%s'"), p); > + > + strbuf_addf(&sb, "%s/.git", p); > + > + if (safe_create_leading_directories_const(sb.buf) < 0) > + die(_("could not create leading directories of '%s'"), sb.buf); > + submodule_dot_git = fopen(sb.buf, "w"); > + if (!submodule_dot_git) > + die (_("cannot open file '%s': %s"), sb.buf, strerror(errno)); Style: drop space before '(' Also, can't you use die_errno() here? > + fprintf(submodule_dot_git, "gitdir: %s\n", > + relative_path(sm_gitdir, path, &rel_path)); > + if (fclose(submodule_dot_git)) > + die(_("could not close file %s"), sb.buf); > + strbuf_reset(&sb); > + > + /* Redirect the worktree of the submodule in the superproject's config */ > + if (strbuf_getcwd(&sb)) > + die_errno(_("unable to get current working directory")); > + > + if (!is_absolute_path(sm_gitdir)) { > + if (strbuf_getcwd(&sb)) > + die_errno(_("unable to get current working directory")); Why does this need to call getcwd() on 'sb' when it was called immediately above the conditional and its value hasn't changed? > + strbuf_addf(&sb, "/%s", sm_gitdir); > + free(sm_gitdir); > + sm_gitdir = strbuf_detach(&sb, NULL); > + } > + > + > + strbuf_addf(&sb, "/%s", path); > + > + p = git_pathdup_submodule(path, "config"); > + if (!p) > + die(_("could not get submodule directory for '%s'"), path); > + git_config_set_in_file(p, "core.worktree", > + relative_path(sb.buf, sm_gitdir, &rel_path)); > + strbuf_release(&sb); Is 'rel_path' being leaked here? > + free(sm_gitdir); > + return 0; > +} > > struct cmd_struct { > const char *cmd; > @@ -132,6 +271,7 @@ struct cmd_struct { > static struct cmd_struct commands[] = { > {"list", module_list}, > {"name", module_name}, > + {"clone", module_clone}, > }; -- 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