1 #define USE_THE_INDEX_COMPATIBILITY_MACROS
 
   3 #include "repository.h"
 
   6 #include "parse-options.h"
 
  10 #include "submodule.h"
 
  11 #include "submodule-config.h"
 
  12 #include "string-list.h"
 
  13 #include "run-command.h"
 
  21 #include "object-store.h"
 
  25 #define OPT_QUIET (1 << 0)
 
  26 #define OPT_CACHED (1 << 1)
 
  27 #define OPT_RECURSIVE (1 << 2)
 
  28 #define OPT_FORCE (1 << 3)
 
  30 typedef void (*each_submodule_fn)(const struct cache_entry *list_item,
 
  33 static char *get_default_remote(void)
 
  35         char *dest = NULL, *ret;
 
  36         struct strbuf sb = STRBUF_INIT;
 
  37         const char *refname = resolve_ref_unsafe("HEAD", 0, NULL, NULL);
 
  40                 die(_("No such ref: %s"), "HEAD");
 
  43         if (!strcmp(refname, "HEAD"))
 
  44                 return xstrdup("origin");
 
  46         if (!skip_prefix(refname, "refs/heads/", &refname))
 
  47                 die(_("Expecting a full ref name, got %s"), refname);
 
  49         strbuf_addf(&sb, "branch.%s.remote", refname);
 
  50         if (git_config_get_string(sb.buf, &dest))
 
  51                 ret = xstrdup("origin");
 
  59 static int print_default_remote(int argc, const char **argv, const char *prefix)
 
  64                 die(_("submodule--helper print-default-remote takes no arguments"));
 
  66         remote = get_default_remote();
 
  68                 printf("%s\n", remote);
 
  74 static int starts_with_dot_slash(const char *str)
 
  76         return str[0] == '.' && is_dir_sep(str[1]);
 
  79 static int starts_with_dot_dot_slash(const char *str)
 
  81         return str[0] == '.' && str[1] == '.' && is_dir_sep(str[2]);
 
  85  * Returns 1 if it was the last chop before ':'.
 
  87 static int chop_last_dir(char **remoteurl, int is_relative)
 
  89         char *rfind = find_last_dir_sep(*remoteurl);
 
  95         rfind = strrchr(*remoteurl, ':');
 
 101         if (is_relative || !strcmp(".", *remoteurl))
 
 102                 die(_("cannot strip one component off url '%s'"),
 
 106         *remoteurl = xstrdup(".");
 
 111  * The `url` argument is the URL that navigates to the submodule origin
 
 112  * repo. When relative, this URL is relative to the superproject origin
 
 113  * URL repo. The `up_path` argument, if specified, is the relative
 
 114  * path that navigates from the submodule working tree to the superproject
 
 115  * working tree. Returns the origin URL of the submodule.
 
 117  * Return either an absolute URL or filesystem path (if the superproject
 
 118  * origin URL is an absolute URL or filesystem path, respectively) or a
 
 119  * relative file system path (if the superproject origin URL is a relative
 
 122  * When the output is a relative file system path, the path is either
 
 123  * relative to the submodule working tree, if up_path is specified, or to
 
 124  * the superproject working tree otherwise.
 
 126  * NEEDSWORK: This works incorrectly on the domain and protocol part.
 
 127  * remote_url      url              outcome          expectation
 
 128  * http://a.com/b  ../c             http://a.com/c   as is
 
 129  * http://a.com/b/ ../c             http://a.com/c   same as previous line, but
 
 130  *                                                   ignore trailing slash in url
 
 131  * http://a.com/b  ../../c          http://c         error out
 
 132  * http://a.com/b  ../../../c       http:/c          error out
 
 133  * http://a.com/b  ../../../../c    http:c           error out
 
 134  * http://a.com/b  ../../../../../c    .:c           error out
 
 135  * NEEDSWORK: Given how chop_last_dir() works, this function is broken
 
 136  * when a local part has a colon in its path component, too.
 
 138 static char *relative_url(const char *remote_url,
 
 145         char *remoteurl = xstrdup(remote_url);
 
 146         struct strbuf sb = STRBUF_INIT;
 
 147         size_t len = strlen(remoteurl);
 
 149         if (is_dir_sep(remoteurl[len-1]))
 
 150                 remoteurl[len-1] = '\0';
 
 152         if (!url_is_local_not_ssh(remoteurl) || is_absolute_path(remoteurl))
 
 157                  * Prepend a './' to ensure all relative
 
 158                  * remoteurls start with './' or '../'
 
 160                 if (!starts_with_dot_slash(remoteurl) &&
 
 161                     !starts_with_dot_dot_slash(remoteurl)) {
 
 163                         strbuf_addf(&sb, "./%s", remoteurl);
 
 165                         remoteurl = strbuf_detach(&sb, NULL);
 
 169          * When the url starts with '../', remove that and the
 
 170          * last directory in remoteurl.
 
 173                 if (starts_with_dot_dot_slash(url)) {
 
 175                         colonsep |= chop_last_dir(&remoteurl, is_relative);
 
 176                 } else if (starts_with_dot_slash(url))
 
 182         strbuf_addf(&sb, "%s%s%s", remoteurl, colonsep ? ":" : "/", url);
 
 183         if (ends_with(url, "/"))
 
 184                 strbuf_setlen(&sb, sb.len - 1);
 
 187         if (starts_with_dot_slash(sb.buf))
 
 188                 out = xstrdup(sb.buf + 2);
 
 190                 out = xstrdup(sb.buf);
 
 193         if (!up_path || !is_relative)
 
 196         strbuf_addf(&sb, "%s%s", up_path, out);
 
 198         return strbuf_detach(&sb, NULL);
 
 201 static int resolve_relative_url(int argc, const char **argv, const char *prefix)
 
 203         char *remoteurl = NULL;
 
 204         char *remote = get_default_remote();
 
 205         const char *up_path = NULL;
 
 208         struct strbuf sb = STRBUF_INIT;
 
 210         if (argc != 2 && argc != 3)
 
 211                 die("resolve-relative-url only accepts one or two arguments");
 
 214         strbuf_addf(&sb, "remote.%s.url", remote);
 
 217         if (git_config_get_string(sb.buf, &remoteurl))
 
 218                 /* the repository is its own authoritative upstream */
 
 219                 remoteurl = xgetcwd();
 
 224         res = relative_url(remoteurl, url, up_path);
 
 231 static int resolve_relative_url_test(int argc, const char **argv, const char *prefix)
 
 233         char *remoteurl, *res;
 
 234         const char *up_path, *url;
 
 237                 die("resolve-relative-url-test only accepts three arguments: <up_path> <remoteurl> <url>");
 
 240         remoteurl = xstrdup(argv[2]);
 
 243         if (!strcmp(up_path, "(null)"))
 
 246         res = relative_url(remoteurl, url, up_path);
 
 253 /* the result should be freed by the caller. */
 
 254 static char *get_submodule_displaypath(const char *path, const char *prefix)
 
 256         const char *super_prefix = get_super_prefix();
 
 258         if (prefix && super_prefix) {
 
 259                 BUG("cannot have prefix '%s' and superprefix '%s'",
 
 260                     prefix, super_prefix);
 
 262                 struct strbuf sb = STRBUF_INIT;
 
 263                 char *displaypath = xstrdup(relative_path(path, prefix, &sb));
 
 266         } else if (super_prefix) {
 
 267                 return xstrfmt("%s%s", super_prefix, path);
 
 269                 return xstrdup(path);
 
 273 static char *compute_rev_name(const char *sub_path, const char* object_id)
 
 275         struct strbuf sb = STRBUF_INIT;
 
 278         static const char *describe_bare[] = { NULL };
 
 280         static const char *describe_tags[] = { "--tags", NULL };
 
 282         static const char *describe_contains[] = { "--contains", NULL };
 
 284         static const char *describe_all_always[] = { "--all", "--always", NULL };
 
 286         static const char **describe_argv[] = { describe_bare, describe_tags,
 
 288                                                 describe_all_always, NULL };
 
 290         for (d = describe_argv; *d; d++) {
 
 291                 struct child_process cp = CHILD_PROCESS_INIT;
 
 292                 prepare_submodule_repo_env(&cp.env_array);
 
 297                 argv_array_push(&cp.args, "describe");
 
 298                 argv_array_pushv(&cp.args, *d);
 
 299                 argv_array_push(&cp.args, object_id);
 
 301                 if (!capture_command(&cp, &sb, 0)) {
 
 302                         strbuf_strip_suffix(&sb, "\n");
 
 303                         return strbuf_detach(&sb, NULL);
 
 312         const struct cache_entry **entries;
 
 315 #define MODULE_LIST_INIT { NULL, 0, 0 }
 
 317 static int module_list_compute(int argc, const char **argv,
 
 319                                struct pathspec *pathspec,
 
 320                                struct module_list *list)
 
 323         char *ps_matched = NULL;
 
 324         parse_pathspec(pathspec, 0,
 
 325                        PATHSPEC_PREFER_FULL,
 
 329                 ps_matched = xcalloc(pathspec->nr, 1);
 
 331         if (read_cache() < 0)
 
 332                 die(_("index file corrupt"));
 
 334         for (i = 0; i < active_nr; i++) {
 
 335                 const struct cache_entry *ce = active_cache[i];
 
 337                 if (!match_pathspec(&the_index, pathspec, ce->name, ce_namelen(ce),
 
 339                     !S_ISGITLINK(ce->ce_mode))
 
 342                 ALLOC_GROW(list->entries, list->nr + 1, list->alloc);
 
 343                 list->entries[list->nr++] = ce;
 
 344                 while (i + 1 < active_nr &&
 
 345                        !strcmp(ce->name, active_cache[i + 1]->name))
 
 347                          * Skip entries with the same name in different stages
 
 348                          * to make sure an entry is returned only once.
 
 353         if (ps_matched && report_path_error(ps_matched, pathspec))
 
 361 static void module_list_active(struct module_list *list)
 
 364         struct module_list active_modules = MODULE_LIST_INIT;
 
 366         for (i = 0; i < list->nr; i++) {
 
 367                 const struct cache_entry *ce = list->entries[i];
 
 369                 if (!is_submodule_active(the_repository, ce->name))
 
 372                 ALLOC_GROW(active_modules.entries,
 
 373                            active_modules.nr + 1,
 
 374                            active_modules.alloc);
 
 375                 active_modules.entries[active_modules.nr++] = ce;
 
 379         *list = active_modules;
 
 382 static char *get_up_path(const char *path)
 
 385         struct strbuf sb = STRBUF_INIT;
 
 387         for (i = count_slashes(path); i; i--)
 
 388                 strbuf_addstr(&sb, "../");
 
 391          * Check if 'path' ends with slash or not
 
 392          * for having the same output for dir/sub_dir
 
 395         if (!is_dir_sep(path[strlen(path) - 1]))
 
 396                 strbuf_addstr(&sb, "../");
 
 398         return strbuf_detach(&sb, NULL);
 
 401 static int module_list(int argc, const char **argv, const char *prefix)
 
 404         struct pathspec pathspec;
 
 405         struct module_list list = MODULE_LIST_INIT;
 
 407         struct option module_list_options[] = {
 
 408                 OPT_STRING(0, "prefix", &prefix,
 
 410                            N_("alternative anchor for relative paths")),
 
 414         const char *const git_submodule_helper_usage[] = {
 
 415                 N_("git submodule--helper list [--prefix=<path>] [<path>...]"),
 
 419         argc = parse_options(argc, argv, prefix, module_list_options,
 
 420                              git_submodule_helper_usage, 0);
 
 422         if (module_list_compute(argc, argv, prefix, &pathspec, &list) < 0)
 
 425         for (i = 0; i < list.nr; i++) {
 
 426                 const struct cache_entry *ce = list.entries[i];
 
 429                         printf("%06o %s U\t", ce->ce_mode, oid_to_hex(&null_oid));
 
 431                         printf("%06o %s %d\t", ce->ce_mode,
 
 432                                oid_to_hex(&ce->oid), ce_stage(ce));
 
 434                 fprintf(stdout, "%s\n", ce->name);
 
 439 static void for_each_listed_submodule(const struct module_list *list,
 
 440                                       each_submodule_fn fn, void *cb_data)
 
 443         for (i = 0; i < list->nr; i++)
 
 444                 fn(list->entries[i], cb_data);
 
 454 #define CB_FOREACH_INIT { 0 }
 
 456 static void runcommand_in_submodule_cb(const struct cache_entry *list_item,
 
 459         struct cb_foreach *info = cb_data;
 
 460         const char *path = list_item->name;
 
 461         const struct object_id *ce_oid = &list_item->oid;
 
 463         const struct submodule *sub;
 
 464         struct child_process cp = CHILD_PROCESS_INIT;
 
 467         displaypath = get_submodule_displaypath(path, info->prefix);
 
 469         sub = submodule_from_path(the_repository, &null_oid, path);
 
 472                 die(_("No url found for submodule path '%s' in .gitmodules"),
 
 475         if (!is_submodule_populated_gently(path, NULL))
 
 478         prepare_submodule_repo_env(&cp.env_array);
 
 481          * For the purpose of executing <command> in the submodule,
 
 482          * separate shell is used for the purpose of running the
 
 489          * NEEDSWORK: the command currently has access to the variables $name,
 
 490          * $sm_path, $displaypath, $sha1 and $toplevel only when the command
 
 491          * contains a single argument. This is done for maintaining a faithful
 
 492          * translation from shell script.
 
 494         if (info->argc == 1) {
 
 495                 char *toplevel = xgetcwd();
 
 496                 struct strbuf sb = STRBUF_INIT;
 
 498                 argv_array_pushf(&cp.env_array, "name=%s", sub->name);
 
 499                 argv_array_pushf(&cp.env_array, "sm_path=%s", path);
 
 500                 argv_array_pushf(&cp.env_array, "displaypath=%s", displaypath);
 
 501                 argv_array_pushf(&cp.env_array, "sha1=%s",
 
 503                 argv_array_pushf(&cp.env_array, "toplevel=%s", toplevel);
 
 506                  * Since the path variable was accessible from the script
 
 507                  * before porting, it is also made available after porting.
 
 508                  * The environment variable "PATH" has a very special purpose
 
 509                  * on windows. And since environment variables are
 
 510                  * case-insensitive in windows, it interferes with the
 
 511                  * existing PATH variable. Hence, to avoid that, we expose
 
 512                  * path via the args argv_array and not via env_array.
 
 514                 sq_quote_buf(&sb, path);
 
 515                 argv_array_pushf(&cp.args, "path=%s; %s",
 
 516                                  sb.buf, info->argv[0]);
 
 520                 argv_array_pushv(&cp.args, info->argv);
 
 524                 printf(_("Entering '%s'\n"), displaypath);
 
 526         if (info->argv[0] && run_command(&cp))
 
 527                 die(_("run_command returned non-zero status for %s\n."),
 
 530         if (info->recursive) {
 
 531                 struct child_process cpr = CHILD_PROCESS_INIT;
 
 535                 prepare_submodule_repo_env(&cpr.env_array);
 
 537                 argv_array_pushl(&cpr.args, "--super-prefix", NULL);
 
 538                 argv_array_pushf(&cpr.args, "%s/", displaypath);
 
 539                 argv_array_pushl(&cpr.args, "submodule--helper", "foreach", "--recursive",
 
 543                         argv_array_push(&cpr.args, "--quiet");
 
 545                 argv_array_push(&cpr.args, "--");
 
 546                 argv_array_pushv(&cpr.args, info->argv);
 
 548                 if (run_command(&cpr))
 
 549                         die(_("run_command returned non-zero status while "
 
 550                                 "recursing in the nested submodules of %s\n."),
 
 558 static int module_foreach(int argc, const char **argv, const char *prefix)
 
 560         struct cb_foreach info = CB_FOREACH_INIT;
 
 561         struct pathspec pathspec;
 
 562         struct module_list list = MODULE_LIST_INIT;
 
 564         struct option module_foreach_options[] = {
 
 565                 OPT__QUIET(&info.quiet, N_("Suppress output of entering each submodule command")),
 
 566                 OPT_BOOL(0, "recursive", &info.recursive,
 
 567                          N_("Recurse into nested submodules")),
 
 571         const char *const git_submodule_helper_usage[] = {
 
 572                 N_("git submodule--helper foreach [--quiet] [--recursive] [--] <command>"),
 
 576         argc = parse_options(argc, argv, prefix, module_foreach_options,
 
 577                              git_submodule_helper_usage, 0);
 
 579         if (module_list_compute(0, NULL, prefix, &pathspec, &list) < 0)
 
 584         info.prefix = prefix;
 
 586         for_each_listed_submodule(&list, runcommand_in_submodule_cb, &info);
 
 591 static char *compute_submodule_clone_url(const char *rel_url)
 
 593         char *remoteurl, *relurl;
 
 594         char *remote = get_default_remote();
 
 595         struct strbuf remotesb = STRBUF_INIT;
 
 597         strbuf_addf(&remotesb, "remote.%s.url", remote);
 
 598         if (git_config_get_string(remotesb.buf, &remoteurl)) {
 
 599                 warning(_("could not look up configuration '%s'. Assuming this repository is its own authoritative upstream."), remotesb.buf);
 
 600                 remoteurl = xgetcwd();
 
 602         relurl = relative_url(remoteurl, rel_url, NULL);
 
 606         strbuf_release(&remotesb);
 
 616 #define INIT_CB_INIT { NULL, 0 }
 
 618 static void init_submodule(const char *path, const char *prefix,
 
 621         const struct submodule *sub;
 
 622         struct strbuf sb = STRBUF_INIT;
 
 623         char *upd = NULL, *url = NULL, *displaypath;
 
 625         displaypath = get_submodule_displaypath(path, prefix);
 
 627         sub = submodule_from_path(the_repository, &null_oid, path);
 
 630                 die(_("No url found for submodule path '%s' in .gitmodules"),
 
 634          * NEEDSWORK: In a multi-working-tree world, this needs to be
 
 635          * set in the per-worktree config.
 
 637          * Set active flag for the submodule being initialized
 
 639         if (!is_submodule_active(the_repository, path)) {
 
 640                 strbuf_addf(&sb, "submodule.%s.active", sub->name);
 
 641                 git_config_set_gently(sb.buf, "true");
 
 646          * Copy url setting when it is not set yet.
 
 647          * To look up the url in .git/config, we must not fall back to
 
 648          * .gitmodules, so look it up directly.
 
 650         strbuf_addf(&sb, "submodule.%s.url", sub->name);
 
 651         if (git_config_get_string(sb.buf, &url)) {
 
 653                         die(_("No url found for submodule path '%s' in .gitmodules"),
 
 656                 url = xstrdup(sub->url);
 
 658                 /* Possibly a url relative to parent */
 
 659                 if (starts_with_dot_dot_slash(url) ||
 
 660                     starts_with_dot_slash(url)) {
 
 662                         url = compute_submodule_clone_url(oldurl);
 
 666                 if (git_config_set_gently(sb.buf, url))
 
 667                         die(_("Failed to register url for submodule path '%s'"),
 
 669                 if (!(flags & OPT_QUIET))
 
 671                                 _("Submodule '%s' (%s) registered for path '%s'\n"),
 
 672                                 sub->name, url, displaypath);
 
 676         /* Copy "update" setting when it is not set yet */
 
 677         strbuf_addf(&sb, "submodule.%s.update", sub->name);
 
 678         if (git_config_get_string(sb.buf, &upd) &&
 
 679             sub->update_strategy.type != SM_UPDATE_UNSPECIFIED) {
 
 680                 if (sub->update_strategy.type == SM_UPDATE_COMMAND) {
 
 681                         fprintf(stderr, _("warning: command update mode suggested for submodule '%s'\n"),
 
 683                         upd = xstrdup("none");
 
 685                         upd = xstrdup(submodule_strategy_to_string(&sub->update_strategy));
 
 687                 if (git_config_set_gently(sb.buf, upd))
 
 688                         die(_("Failed to register update mode for submodule path '%s'"), displaypath);
 
 696 static void init_submodule_cb(const struct cache_entry *list_item, void *cb_data)
 
 698         struct init_cb *info = cb_data;
 
 699         init_submodule(list_item->name, info->prefix, info->flags);
 
 702 static int module_init(int argc, const char **argv, const char *prefix)
 
 704         struct init_cb info = INIT_CB_INIT;
 
 705         struct pathspec pathspec;
 
 706         struct module_list list = MODULE_LIST_INIT;
 
 709         struct option module_init_options[] = {
 
 710                 OPT__QUIET(&quiet, N_("Suppress output for initializing a submodule")),
 
 714         const char *const git_submodule_helper_usage[] = {
 
 715                 N_("git submodule--helper init [<options>] [<path>]"),
 
 719         argc = parse_options(argc, argv, prefix, module_init_options,
 
 720                              git_submodule_helper_usage, 0);
 
 722         if (module_list_compute(argc, argv, prefix, &pathspec, &list) < 0)
 
 726          * If there are no path args and submodule.active is set then,
 
 727          * by default, only initialize 'active' modules.
 
 729         if (!argc && git_config_get_value_multi("submodule.active"))
 
 730                 module_list_active(&list);
 
 732         info.prefix = prefix;
 
 734                 info.flags |= OPT_QUIET;
 
 736         for_each_listed_submodule(&list, init_submodule_cb, &info);
 
 746 #define STATUS_CB_INIT { NULL, 0 }
 
 748 static void print_status(unsigned int flags, char state, const char *path,
 
 749                          const struct object_id *oid, const char *displaypath)
 
 751         if (flags & OPT_QUIET)
 
 754         printf("%c%s %s", state, oid_to_hex(oid), displaypath);
 
 756         if (state == ' ' || state == '+') {
 
 757                 const char *name = compute_rev_name(path, oid_to_hex(oid));
 
 760                         printf(" (%s)", name);
 
 766 static int handle_submodule_head_ref(const char *refname,
 
 767                                      const struct object_id *oid, int flags,
 
 770         struct object_id *output = cb_data;
 
 777 static void status_submodule(const char *path, const struct object_id *ce_oid,
 
 778                              unsigned int ce_flags, const char *prefix,
 
 782         struct argv_array diff_files_args = ARGV_ARRAY_INIT;
 
 784         int diff_files_result;
 
 785         struct strbuf buf = STRBUF_INIT;
 
 788         if (!submodule_from_path(the_repository, &null_oid, path))
 
 789                 die(_("no submodule mapping found in .gitmodules for path '%s'"),
 
 792         displaypath = get_submodule_displaypath(path, prefix);
 
 794         if ((CE_STAGEMASK & ce_flags) >> CE_STAGESHIFT) {
 
 795                 print_status(flags, 'U', path, &null_oid, displaypath);
 
 799         strbuf_addf(&buf, "%s/.git", path);
 
 800         git_dir = read_gitfile(buf.buf);
 
 804         if (!is_submodule_active(the_repository, path) ||
 
 805             !is_git_directory(git_dir)) {
 
 806                 print_status(flags, '-', path, ce_oid, displaypath);
 
 807                 strbuf_release(&buf);
 
 810         strbuf_release(&buf);
 
 812         argv_array_pushl(&diff_files_args, "diff-files",
 
 813                          "--ignore-submodules=dirty", "--quiet", "--",
 
 816         git_config(git_diff_basic_config, NULL);
 
 818         repo_init_revisions(the_repository, &rev, NULL);
 
 820         diff_files_args.argc = setup_revisions(diff_files_args.argc,
 
 821                                                diff_files_args.argv,
 
 823         diff_files_result = run_diff_files(&rev, 0);
 
 825         if (!diff_result_code(&rev.diffopt, diff_files_result)) {
 
 826                 print_status(flags, ' ', path, ce_oid,
 
 828         } else if (!(flags & OPT_CACHED)) {
 
 829                 struct object_id oid;
 
 830                 struct ref_store *refs = get_submodule_ref_store(path);
 
 833                         print_status(flags, '-', path, ce_oid, displaypath);
 
 836                 if (refs_head_ref(refs, handle_submodule_head_ref, &oid))
 
 837                         die(_("could not resolve HEAD ref inside the "
 
 838                               "submodule '%s'"), path);
 
 840                 print_status(flags, '+', path, &oid, displaypath);
 
 842                 print_status(flags, '+', path, ce_oid, displaypath);
 
 845         if (flags & OPT_RECURSIVE) {
 
 846                 struct child_process cpr = CHILD_PROCESS_INIT;
 
 850                 prepare_submodule_repo_env(&cpr.env_array);
 
 852                 argv_array_push(&cpr.args, "--super-prefix");
 
 853                 argv_array_pushf(&cpr.args, "%s/", displaypath);
 
 854                 argv_array_pushl(&cpr.args, "submodule--helper", "status",
 
 855                                  "--recursive", NULL);
 
 857                 if (flags & OPT_CACHED)
 
 858                         argv_array_push(&cpr.args, "--cached");
 
 860                 if (flags & OPT_QUIET)
 
 861                         argv_array_push(&cpr.args, "--quiet");
 
 863                 if (run_command(&cpr))
 
 864                         die(_("failed to recurse into submodule '%s'"), path);
 
 868         argv_array_clear(&diff_files_args);
 
 872 static void status_submodule_cb(const struct cache_entry *list_item,
 
 875         struct status_cb *info = cb_data;
 
 876         status_submodule(list_item->name, &list_item->oid, list_item->ce_flags,
 
 877                          info->prefix, info->flags);
 
 880 static int module_status(int argc, const char **argv, const char *prefix)
 
 882         struct status_cb info = STATUS_CB_INIT;
 
 883         struct pathspec pathspec;
 
 884         struct module_list list = MODULE_LIST_INIT;
 
 887         struct option module_status_options[] = {
 
 888                 OPT__QUIET(&quiet, N_("Suppress submodule status output")),
 
 889                 OPT_BIT(0, "cached", &info.flags, N_("Use commit stored in the index instead of the one stored in the submodule HEAD"), OPT_CACHED),
 
 890                 OPT_BIT(0, "recursive", &info.flags, N_("recurse into nested submodules"), OPT_RECURSIVE),
 
 894         const char *const git_submodule_helper_usage[] = {
 
 895                 N_("git submodule status [--quiet] [--cached] [--recursive] [<path>...]"),
 
 899         argc = parse_options(argc, argv, prefix, module_status_options,
 
 900                              git_submodule_helper_usage, 0);
 
 902         if (module_list_compute(argc, argv, prefix, &pathspec, &list) < 0)
 
 905         info.prefix = prefix;
 
 907                 info.flags |= OPT_QUIET;
 
 909         for_each_listed_submodule(&list, status_submodule_cb, &info);
 
 914 static int module_name(int argc, const char **argv, const char *prefix)
 
 916         const struct submodule *sub;
 
 919                 usage(_("git submodule--helper name <path>"));
 
 921         sub = submodule_from_path(the_repository, &null_oid, argv[1]);
 
 924                 die(_("no submodule mapping found in .gitmodules for path '%s'"),
 
 927         printf("%s\n", sub->name);
 
 937 #define SYNC_CB_INIT { NULL, 0 }
 
 939 static void sync_submodule(const char *path, const char *prefix,
 
 942         const struct submodule *sub;
 
 943         char *remote_key = NULL;
 
 944         char *sub_origin_url, *super_config_url, *displaypath;
 
 945         struct strbuf sb = STRBUF_INIT;
 
 946         struct child_process cp = CHILD_PROCESS_INIT;
 
 947         char *sub_config_path = NULL;
 
 949         if (!is_submodule_active(the_repository, path))
 
 952         sub = submodule_from_path(the_repository, &null_oid, path);
 
 954         if (sub && sub->url) {
 
 955                 if (starts_with_dot_dot_slash(sub->url) ||
 
 956                     starts_with_dot_slash(sub->url)) {
 
 957                         char *remote_url, *up_path;
 
 958                         char *remote = get_default_remote();
 
 959                         strbuf_addf(&sb, "remote.%s.url", remote);
 
 961                         if (git_config_get_string(sb.buf, &remote_url))
 
 962                                 remote_url = xgetcwd();
 
 964                         up_path = get_up_path(path);
 
 965                         sub_origin_url = relative_url(remote_url, sub->url, up_path);
 
 966                         super_config_url = relative_url(remote_url, sub->url, NULL);
 
 972                         sub_origin_url = xstrdup(sub->url);
 
 973                         super_config_url = xstrdup(sub->url);
 
 976                 sub_origin_url = xstrdup("");
 
 977                 super_config_url = xstrdup("");
 
 980         displaypath = get_submodule_displaypath(path, prefix);
 
 982         if (!(flags & OPT_QUIET))
 
 983                 printf(_("Synchronizing submodule url for '%s'\n"),
 
 987         strbuf_addf(&sb, "submodule.%s.url", sub->name);
 
 988         if (git_config_set_gently(sb.buf, super_config_url))
 
 989                 die(_("failed to register url for submodule path '%s'"),
 
 992         if (!is_submodule_populated_gently(path, NULL))
 
 995         prepare_submodule_repo_env(&cp.env_array);
 
 998         argv_array_pushl(&cp.args, "submodule--helper",
 
 999                          "print-default-remote", NULL);
 
1002         if (capture_command(&cp, &sb, 0))
 
1003                 die(_("failed to get the default remote for submodule '%s'"),
 
1006         strbuf_strip_suffix(&sb, "\n");
 
1007         remote_key = xstrfmt("remote.%s.url", sb.buf);
 
1010         submodule_to_gitdir(&sb, path);
 
1011         strbuf_addstr(&sb, "/config");
 
1013         if (git_config_set_in_file_gently(sb.buf, remote_key, sub_origin_url))
 
1014                 die(_("failed to update remote for submodule '%s'"),
 
1017         if (flags & OPT_RECURSIVE) {
 
1018                 struct child_process cpr = CHILD_PROCESS_INIT;
 
1022                 prepare_submodule_repo_env(&cpr.env_array);
 
1024                 argv_array_push(&cpr.args, "--super-prefix");
 
1025                 argv_array_pushf(&cpr.args, "%s/", displaypath);
 
1026                 argv_array_pushl(&cpr.args, "submodule--helper", "sync",
 
1027                                  "--recursive", NULL);
 
1029                 if (flags & OPT_QUIET)
 
1030                         argv_array_push(&cpr.args, "--quiet");
 
1032                 if (run_command(&cpr))
 
1033                         die(_("failed to recurse into submodule '%s'"),
 
1038         free(super_config_url);
 
1039         free(sub_origin_url);
 
1040         strbuf_release(&sb);
 
1043         free(sub_config_path);
 
1046 static void sync_submodule_cb(const struct cache_entry *list_item, void *cb_data)
 
1048         struct sync_cb *info = cb_data;
 
1049         sync_submodule(list_item->name, info->prefix, info->flags);
 
1052 static int module_sync(int argc, const char **argv, const char *prefix)
 
1054         struct sync_cb info = SYNC_CB_INIT;
 
1055         struct pathspec pathspec;
 
1056         struct module_list list = MODULE_LIST_INIT;
 
1060         struct option module_sync_options[] = {
 
1061                 OPT__QUIET(&quiet, N_("Suppress output of synchronizing submodule url")),
 
1062                 OPT_BOOL(0, "recursive", &recursive,
 
1063                         N_("Recurse into nested submodules")),
 
1067         const char *const git_submodule_helper_usage[] = {
 
1068                 N_("git submodule--helper sync [--quiet] [--recursive] [<path>]"),
 
1072         argc = parse_options(argc, argv, prefix, module_sync_options,
 
1073                              git_submodule_helper_usage, 0);
 
1075         if (module_list_compute(argc, argv, prefix, &pathspec, &list) < 0)
 
1078         info.prefix = prefix;
 
1080                 info.flags |= OPT_QUIET;
 
1082                 info.flags |= OPT_RECURSIVE;
 
1084         for_each_listed_submodule(&list, sync_submodule_cb, &info);
 
1093 #define DEINIT_CB_INIT { NULL, 0 }
 
1095 static void deinit_submodule(const char *path, const char *prefix,
 
1098         const struct submodule *sub;
 
1099         char *displaypath = NULL;
 
1100         struct child_process cp_config = CHILD_PROCESS_INIT;
 
1101         struct strbuf sb_config = STRBUF_INIT;
 
1102         char *sub_git_dir = xstrfmt("%s/.git", path);
 
1104         sub = submodule_from_path(the_repository, &null_oid, path);
 
1106         if (!sub || !sub->name)
 
1109         displaypath = get_submodule_displaypath(path, prefix);
 
1111         /* remove the submodule work tree (unless the user already did it) */
 
1112         if (is_directory(path)) {
 
1113                 struct strbuf sb_rm = STRBUF_INIT;
 
1117                  * protect submodules containing a .git directory
 
1118                  * NEEDSWORK: instead of dying, automatically call
 
1119                  * absorbgitdirs and (possibly) warn.
 
1121                 if (is_directory(sub_git_dir))
 
1122                         die(_("Submodule work tree '%s' contains a .git "
 
1123                               "directory (use 'rm -rf' if you really want "
 
1124                               "to remove it including all of its history)"),
 
1127                 if (!(flags & OPT_FORCE)) {
 
1128                         struct child_process cp_rm = CHILD_PROCESS_INIT;
 
1130                         argv_array_pushl(&cp_rm.args, "rm", "-qn",
 
1133                         if (run_command(&cp_rm))
 
1134                                 die(_("Submodule work tree '%s' contains local "
 
1135                                       "modifications; use '-f' to discard them"),
 
1139                 strbuf_addstr(&sb_rm, path);
 
1141                 if (!remove_dir_recursively(&sb_rm, 0))
 
1142                         format = _("Cleared directory '%s'\n");
 
1144                         format = _("Could not remove submodule work tree '%s'\n");
 
1146                 if (!(flags & OPT_QUIET))
 
1147                         printf(format, displaypath);
 
1149                 submodule_unset_core_worktree(sub);
 
1151                 strbuf_release(&sb_rm);
 
1154         if (mkdir(path, 0777))
 
1155                 printf(_("could not create empty submodule directory %s"),
 
1158         cp_config.git_cmd = 1;
 
1159         argv_array_pushl(&cp_config.args, "config", "--get-regexp", NULL);
 
1160         argv_array_pushf(&cp_config.args, "submodule.%s\\.", sub->name);
 
1162         /* remove the .git/config entries (unless the user already did it) */
 
1163         if (!capture_command(&cp_config, &sb_config, 0) && sb_config.len) {
 
1164                 char *sub_key = xstrfmt("submodule.%s", sub->name);
 
1166                  * remove the whole section so we have a clean state when
 
1167                  * the user later decides to init this submodule again
 
1169                 git_config_rename_section_in_file(NULL, sub_key, NULL);
 
1170                 if (!(flags & OPT_QUIET))
 
1171                         printf(_("Submodule '%s' (%s) unregistered for path '%s'\n"),
 
1172                                  sub->name, sub->url, displaypath);
 
1179         strbuf_release(&sb_config);
 
1182 static void deinit_submodule_cb(const struct cache_entry *list_item,
 
1185         struct deinit_cb *info = cb_data;
 
1186         deinit_submodule(list_item->name, info->prefix, info->flags);
 
1189 static int module_deinit(int argc, const char **argv, const char *prefix)
 
1191         struct deinit_cb info = DEINIT_CB_INIT;
 
1192         struct pathspec pathspec;
 
1193         struct module_list list = MODULE_LIST_INIT;
 
1198         struct option module_deinit_options[] = {
 
1199                 OPT__QUIET(&quiet, N_("Suppress submodule status output")),
 
1200                 OPT__FORCE(&force, N_("Remove submodule working trees even if they contain local changes"), 0),
 
1201                 OPT_BOOL(0, "all", &all, N_("Unregister all submodules")),
 
1205         const char *const git_submodule_helper_usage[] = {
 
1206                 N_("git submodule deinit [--quiet] [-f | --force] [--all | [--] [<path>...]]"),
 
1210         argc = parse_options(argc, argv, prefix, module_deinit_options,
 
1211                              git_submodule_helper_usage, 0);
 
1214                 error("pathspec and --all are incompatible");
 
1215                 usage_with_options(git_submodule_helper_usage,
 
1216                                    module_deinit_options);
 
1220                 die(_("Use '--all' if you really want to deinitialize all submodules"));
 
1222         if (module_list_compute(argc, argv, prefix, &pathspec, &list) < 0)
 
1225         info.prefix = prefix;
 
1227                 info.flags |= OPT_QUIET;
 
1229                 info.flags |= OPT_FORCE;
 
1231         for_each_listed_submodule(&list, deinit_submodule_cb, &info);
 
1236 static int clone_submodule(const char *path, const char *gitdir, const char *url,
 
1237                            const char *depth, struct string_list *reference, int dissociate,
 
1238                            int quiet, int progress)
 
1240         struct child_process cp = CHILD_PROCESS_INIT;
 
1242         argv_array_push(&cp.args, "clone");
 
1243         argv_array_push(&cp.args, "--no-checkout");
 
1245                 argv_array_push(&cp.args, "--quiet");
 
1247                 argv_array_push(&cp.args, "--progress");
 
1248         if (depth && *depth)
 
1249                 argv_array_pushl(&cp.args, "--depth", depth, NULL);
 
1250         if (reference->nr) {
 
1251                 struct string_list_item *item;
 
1252                 for_each_string_list_item(item, reference)
 
1253                         argv_array_pushl(&cp.args, "--reference",
 
1254                                          item->string, NULL);
 
1257                 argv_array_push(&cp.args, "--dissociate");
 
1258         if (gitdir && *gitdir)
 
1259                 argv_array_pushl(&cp.args, "--separate-git-dir", gitdir, NULL);
 
1261         argv_array_push(&cp.args, "--");
 
1262         argv_array_push(&cp.args, url);
 
1263         argv_array_push(&cp.args, path);
 
1266         prepare_submodule_repo_env(&cp.env_array);
 
1269         return run_command(&cp);
 
1272 struct submodule_alternate_setup {
 
1273         const char *submodule_name;
 
1274         enum SUBMODULE_ALTERNATE_ERROR_MODE {
 
1275                 SUBMODULE_ALTERNATE_ERROR_DIE,
 
1276                 SUBMODULE_ALTERNATE_ERROR_INFO,
 
1277                 SUBMODULE_ALTERNATE_ERROR_IGNORE
 
1279         struct string_list *reference;
 
1281 #define SUBMODULE_ALTERNATE_SETUP_INIT { NULL, \
 
1282         SUBMODULE_ALTERNATE_ERROR_IGNORE, NULL }
 
1284 static const char alternate_error_advice[] = N_(
 
1285 "An alternate computed from a superproject's alternate is invalid.\n"
 
1286 "To allow Git to clone without an alternate in such a case, set\n"
 
1287 "submodule.alternateErrorStrategy to 'info' or, equivalently, clone with\n"
 
1288 "'--reference-if-able' instead of '--reference'."
 
1291 static int add_possible_reference_from_superproject(
 
1292                 struct object_directory *odb, void *sas_cb)
 
1294         struct submodule_alternate_setup *sas = sas_cb;
 
1298          * If the alternate object store is another repository, try the
 
1299          * standard layout with .git/(modules/<name>)+/objects
 
1301         if (strip_suffix(odb->path, "/objects", &len)) {
 
1303                 struct strbuf sb = STRBUF_INIT;
 
1304                 struct strbuf err = STRBUF_INIT;
 
1305                 strbuf_add(&sb, odb->path, len);
 
1308                  * We need to end the new path with '/' to mark it as a dir,
 
1309                  * otherwise a submodule name containing '/' will be broken
 
1310                  * as the last part of a missing submodule reference would
 
1311                  * be taken as a file name.
 
1313                 strbuf_addf(&sb, "/modules/%s/", sas->submodule_name);
 
1315                 sm_alternate = compute_alternate_path(sb.buf, &err);
 
1317                         string_list_append(sas->reference, xstrdup(sb.buf));
 
1320                         switch (sas->error_mode) {
 
1321                         case SUBMODULE_ALTERNATE_ERROR_DIE:
 
1322                                 if (advice_submodule_alternate_error_strategy_die)
 
1323                                         advise(_(alternate_error_advice));
 
1324                                 die(_("submodule '%s' cannot add alternate: %s"),
 
1325                                     sas->submodule_name, err.buf);
 
1326                         case SUBMODULE_ALTERNATE_ERROR_INFO:
 
1327                                 fprintf_ln(stderr, _("submodule '%s' cannot add alternate: %s"),
 
1328                                         sas->submodule_name, err.buf);
 
1329                         case SUBMODULE_ALTERNATE_ERROR_IGNORE:
 
1333                 strbuf_release(&sb);
 
1339 static void prepare_possible_alternates(const char *sm_name,
 
1340                 struct string_list *reference)
 
1342         char *sm_alternate = NULL, *error_strategy = NULL;
 
1343         struct submodule_alternate_setup sas = SUBMODULE_ALTERNATE_SETUP_INIT;
 
1345         git_config_get_string("submodule.alternateLocation", &sm_alternate);
 
1349         git_config_get_string("submodule.alternateErrorStrategy", &error_strategy);
 
1351         if (!error_strategy)
 
1352                 error_strategy = xstrdup("die");
 
1354         sas.submodule_name = sm_name;
 
1355         sas.reference = reference;
 
1356         if (!strcmp(error_strategy, "die"))
 
1357                 sas.error_mode = SUBMODULE_ALTERNATE_ERROR_DIE;
 
1358         else if (!strcmp(error_strategy, "info"))
 
1359                 sas.error_mode = SUBMODULE_ALTERNATE_ERROR_INFO;
 
1360         else if (!strcmp(error_strategy, "ignore"))
 
1361                 sas.error_mode = SUBMODULE_ALTERNATE_ERROR_IGNORE;
 
1363                 die(_("Value '%s' for submodule.alternateErrorStrategy is not recognized"), error_strategy);
 
1365         if (!strcmp(sm_alternate, "superproject"))
 
1366                 foreach_alt_odb(add_possible_reference_from_superproject, &sas);
 
1367         else if (!strcmp(sm_alternate, "no"))
 
1370                 die(_("Value '%s' for submodule.alternateLocation is not recognized"), sm_alternate);
 
1373         free(error_strategy);
 
1376 static int module_clone(int argc, const char **argv, const char *prefix)
 
1378         const char *name = NULL, *url = NULL, *depth = NULL;
 
1381         char *p, *path = NULL, *sm_gitdir;
 
1382         struct strbuf sb = STRBUF_INIT;
 
1383         struct string_list reference = STRING_LIST_INIT_NODUP;
 
1384         int dissociate = 0, require_init = 0;
 
1385         char *sm_alternate = NULL, *error_strategy = NULL;
 
1387         struct option module_clone_options[] = {
 
1388                 OPT_STRING(0, "prefix", &prefix,
 
1390                            N_("alternative anchor for relative paths")),
 
1391                 OPT_STRING(0, "path", &path,
 
1393                            N_("where the new submodule will be cloned to")),
 
1394                 OPT_STRING(0, "name", &name,
 
1396                            N_("name of the new submodule")),
 
1397                 OPT_STRING(0, "url", &url,
 
1399                            N_("url where to clone the submodule from")),
 
1400                 OPT_STRING_LIST(0, "reference", &reference,
 
1402                            N_("reference repository")),
 
1403                 OPT_BOOL(0, "dissociate", &dissociate,
 
1404                            N_("use --reference only while cloning")),
 
1405                 OPT_STRING(0, "depth", &depth,
 
1407                            N_("depth for shallow clones")),
 
1408                 OPT__QUIET(&quiet, "Suppress output for cloning a submodule"),
 
1409                 OPT_BOOL(0, "progress", &progress,
 
1410                            N_("force cloning progress")),
 
1411                 OPT_BOOL(0, "require-init", &require_init,
 
1412                            N_("disallow cloning into non-empty directory")),
 
1416         const char *const git_submodule_helper_usage[] = {
 
1417                 N_("git submodule--helper clone [--prefix=<path>] [--quiet] "
 
1418                    "[--reference <repository>] [--name <name>] [--depth <depth>] "
 
1419                    "--url <url> --path <path>"),
 
1423         argc = parse_options(argc, argv, prefix, module_clone_options,
 
1424                              git_submodule_helper_usage, 0);
 
1426         if (argc || !url || !path || !*path)
 
1427                 usage_with_options(git_submodule_helper_usage,
 
1428                                    module_clone_options);
 
1430         strbuf_addf(&sb, "%s/modules/%s", get_git_dir(), name);
 
1431         sm_gitdir = absolute_pathdup(sb.buf);
 
1434         if (!is_absolute_path(path)) {
 
1435                 strbuf_addf(&sb, "%s/%s", get_git_work_tree(), path);
 
1436                 path = strbuf_detach(&sb, NULL);
 
1438                 path = xstrdup(path);
 
1440         if (validate_submodule_git_dir(sm_gitdir, name) < 0)
 
1441                 die(_("refusing to create/use '%s' in another submodule's "
 
1442                         "git dir"), sm_gitdir);
 
1444         if (!file_exists(sm_gitdir)) {
 
1445                 if (safe_create_leading_directories_const(sm_gitdir) < 0)
 
1446                         die(_("could not create directory '%s'"), sm_gitdir);
 
1448                 prepare_possible_alternates(name, &reference);
 
1450                 if (clone_submodule(path, sm_gitdir, url, depth, &reference, dissociate,
 
1452                         die(_("clone of '%s' into submodule path '%s' failed"),
 
1455                 if (require_init && !access(path, X_OK) && !is_empty_dir(path))
 
1456                         die(_("directory not empty: '%s'"), path);
 
1457                 if (safe_create_leading_directories_const(path) < 0)
 
1458                         die(_("could not create directory '%s'"), path);
 
1459                 strbuf_addf(&sb, "%s/index", sm_gitdir);
 
1460                 unlink_or_warn(sb.buf);
 
1464         connect_work_tree_and_git_dir(path, sm_gitdir, 0);
 
1466         p = git_pathdup_submodule(path, "config");
 
1468                 die(_("could not get submodule directory for '%s'"), path);
 
1470         /* setup alternateLocation and alternateErrorStrategy in the cloned submodule if needed */
 
1471         git_config_get_string("submodule.alternateLocation", &sm_alternate);
 
1473                 git_config_set_in_file(p, "submodule.alternateLocation",
 
1475         git_config_get_string("submodule.alternateErrorStrategy", &error_strategy);
 
1477                 git_config_set_in_file(p, "submodule.alternateErrorStrategy",
 
1481         free(error_strategy);
 
1483         strbuf_release(&sb);
 
1490 static void determine_submodule_update_strategy(struct repository *r,
 
1494                                                 struct submodule_update_strategy *out)
 
1496         const struct submodule *sub = submodule_from_path(r, &null_oid, path);
 
1500         key = xstrfmt("submodule.%s.update", sub->name);
 
1503                 if (parse_submodule_update_strategy(update, out) < 0)
 
1504                         die(_("Invalid update mode '%s' for submodule path '%s'"),
 
1506         } else if (!repo_config_get_string_const(r, key, &val)) {
 
1507                 if (parse_submodule_update_strategy(val, out) < 0)
 
1508                         die(_("Invalid update mode '%s' configured for submodule path '%s'"),
 
1510         } else if (sub->update_strategy.type != SM_UPDATE_UNSPECIFIED) {
 
1511                 if (sub->update_strategy.type == SM_UPDATE_COMMAND)
 
1512                         BUG("how did we read update = !command from .gitmodules?");
 
1513                 out->type = sub->update_strategy.type;
 
1514                 out->command = sub->update_strategy.command;
 
1516                 out->type = SM_UPDATE_CHECKOUT;
 
1519             (out->type == SM_UPDATE_MERGE ||
 
1520              out->type == SM_UPDATE_REBASE ||
 
1521              out->type == SM_UPDATE_NONE))
 
1522                 out->type = SM_UPDATE_CHECKOUT;
 
1527 static int module_update_module_mode(int argc, const char **argv, const char *prefix)
 
1529         const char *path, *update = NULL;
 
1531         struct submodule_update_strategy update_strategy = { .type = SM_UPDATE_CHECKOUT };
 
1533         if (argc < 3 || argc > 4)
 
1534                 die("submodule--helper update-module-clone expects <just-cloned> <path> [<update>]");
 
1536         just_cloned = git_config_int("just_cloned", argv[1]);
 
1542         determine_submodule_update_strategy(the_repository,
 
1543                                             just_cloned, path, update,
 
1545         fputs(submodule_strategy_to_string(&update_strategy), stdout);
 
1550 struct update_clone_data {
 
1551         const struct submodule *sub;
 
1552         struct object_id oid;
 
1553         unsigned just_cloned;
 
1556 struct submodule_update_clone {
 
1557         /* index into 'list', the list of submodules to look into for cloning */
 
1559         struct module_list list;
 
1560         unsigned warn_if_uninitialized : 1;
 
1562         /* update parameter passed via commandline */
 
1563         struct submodule_update_strategy update;
 
1565         /* configuration parameters which are passed on to the children */
 
1568         int recommend_shallow;
 
1569         struct string_list references;
 
1571         unsigned require_init;
 
1573         const char *recursive_prefix;
 
1576         /* to be consumed by git-submodule.sh */
 
1577         struct update_clone_data *update_clone;
 
1578         int update_clone_nr; int update_clone_alloc;
 
1580         /* If we want to stop as fast as possible and return an error */
 
1581         unsigned quickstop : 1;
 
1583         /* failed clones to be retried again */
 
1584         const struct cache_entry **failed_clones;
 
1585         int failed_clones_nr, failed_clones_alloc;
 
1589 #define SUBMODULE_UPDATE_CLONE_INIT {0, MODULE_LIST_INIT, 0, \
 
1590         SUBMODULE_UPDATE_STRATEGY_INIT, 0, 0, -1, STRING_LIST_INIT_DUP, 0, 0, \
 
1592         NULL, 0, 0, 0, NULL, 0, 0, 1}
 
1595 static void next_submodule_warn_missing(struct submodule_update_clone *suc,
 
1596                 struct strbuf *out, const char *displaypath)
 
1599          * Only mention uninitialized submodules when their
 
1600          * paths have been specified.
 
1602         if (suc->warn_if_uninitialized) {
 
1604                         _("Submodule path '%s' not initialized"),
 
1606                 strbuf_addch(out, '\n');
 
1608                         _("Maybe you want to use 'update --init'?"));
 
1609                 strbuf_addch(out, '\n');
 
1614  * Determine whether 'ce' needs to be cloned. If so, prepare the 'child' to
 
1615  * run the clone. Returns 1 if 'ce' needs to be cloned, 0 otherwise.
 
1617 static int prepare_to_clone_next_submodule(const struct cache_entry *ce,
 
1618                                            struct child_process *child,
 
1619                                            struct submodule_update_clone *suc,
 
1622         const struct submodule *sub = NULL;
 
1623         const char *url = NULL;
 
1624         const char *update_string;
 
1625         enum submodule_update_type update_type;
 
1627         struct strbuf displaypath_sb = STRBUF_INIT;
 
1628         struct strbuf sb = STRBUF_INIT;
 
1629         const char *displaypath = NULL;
 
1630         int needs_cloning = 0;
 
1631         int need_free_url = 0;
 
1634                 if (suc->recursive_prefix)
 
1635                         strbuf_addf(&sb, "%s/%s", suc->recursive_prefix, ce->name);
 
1637                         strbuf_addstr(&sb, ce->name);
 
1638                 strbuf_addf(out, _("Skipping unmerged submodule %s"), sb.buf);
 
1639                 strbuf_addch(out, '\n');
 
1643         sub = submodule_from_path(the_repository, &null_oid, ce->name);
 
1645         if (suc->recursive_prefix)
 
1646                 displaypath = relative_path(suc->recursive_prefix,
 
1647                                             ce->name, &displaypath_sb);
 
1649                 displaypath = ce->name;
 
1652                 next_submodule_warn_missing(suc, out, displaypath);
 
1656         key = xstrfmt("submodule.%s.update", sub->name);
 
1657         if (!repo_config_get_string_const(the_repository, key, &update_string)) {
 
1658                 update_type = parse_submodule_update_type(update_string);
 
1660                 update_type = sub->update_strategy.type;
 
1664         if (suc->update.type == SM_UPDATE_NONE
 
1665             || (suc->update.type == SM_UPDATE_UNSPECIFIED
 
1666                 && update_type == SM_UPDATE_NONE)) {
 
1667                 strbuf_addf(out, _("Skipping submodule '%s'"), displaypath);
 
1668                 strbuf_addch(out, '\n');
 
1672         /* Check if the submodule has been initialized. */
 
1673         if (!is_submodule_active(the_repository, ce->name)) {
 
1674                 next_submodule_warn_missing(suc, out, displaypath);
 
1679         strbuf_addf(&sb, "submodule.%s.url", sub->name);
 
1680         if (repo_config_get_string_const(the_repository, sb.buf, &url)) {
 
1681                 if (starts_with_dot_slash(sub->url) ||
 
1682                     starts_with_dot_dot_slash(sub->url)) {
 
1683                         url = compute_submodule_clone_url(sub->url);
 
1690         strbuf_addf(&sb, "%s/.git", ce->name);
 
1691         needs_cloning = !file_exists(sb.buf);
 
1693         ALLOC_GROW(suc->update_clone, suc->update_clone_nr + 1,
 
1694                    suc->update_clone_alloc);
 
1695         oidcpy(&suc->update_clone[suc->update_clone_nr].oid, &ce->oid);
 
1696         suc->update_clone[suc->update_clone_nr].just_cloned = needs_cloning;
 
1697         suc->update_clone[suc->update_clone_nr].sub = sub;
 
1698         suc->update_clone_nr++;
 
1704         child->no_stdin = 1;
 
1705         child->stdout_to_stderr = 1;
 
1707         argv_array_push(&child->args, "submodule--helper");
 
1708         argv_array_push(&child->args, "clone");
 
1710                 argv_array_push(&child->args, "--progress");
 
1712                 argv_array_push(&child->args, "--quiet");
 
1714                 argv_array_pushl(&child->args, "--prefix", suc->prefix, NULL);
 
1715         if (suc->recommend_shallow && sub->recommend_shallow == 1)
 
1716                 argv_array_push(&child->args, "--depth=1");
 
1717         if (suc->require_init)
 
1718                 argv_array_push(&child->args, "--require-init");
 
1719         argv_array_pushl(&child->args, "--path", sub->path, NULL);
 
1720         argv_array_pushl(&child->args, "--name", sub->name, NULL);
 
1721         argv_array_pushl(&child->args, "--url", url, NULL);
 
1722         if (suc->references.nr) {
 
1723                 struct string_list_item *item;
 
1724                 for_each_string_list_item(item, &suc->references)
 
1725                         argv_array_pushl(&child->args, "--reference", item->string, NULL);
 
1727         if (suc->dissociate)
 
1728                 argv_array_push(&child->args, "--dissociate");
 
1730                 argv_array_push(&child->args, suc->depth);
 
1733         strbuf_reset(&displaypath_sb);
 
1738         return needs_cloning;
 
1741 static int update_clone_get_next_task(struct child_process *child,
 
1746         struct submodule_update_clone *suc = suc_cb;
 
1747         const struct cache_entry *ce;
 
1750         for (; suc->current < suc->list.nr; suc->current++) {
 
1751                 ce = suc->list.entries[suc->current];
 
1752                 if (prepare_to_clone_next_submodule(ce, child, suc, err)) {
 
1753                         int *p = xmalloc(sizeof(*p));
 
1762          * The loop above tried cloning each submodule once, now try the
 
1763          * stragglers again, which we can imagine as an extension of the
 
1766         index = suc->current - suc->list.nr;
 
1767         if (index < suc->failed_clones_nr) {
 
1769                 ce = suc->failed_clones[index];
 
1770                 if (!prepare_to_clone_next_submodule(ce, child, suc, err)) {
 
1772                         strbuf_addstr(err, "BUG: submodule considered for "
 
1773                                            "cloning, doesn't need cloning "
 
1777                 p = xmalloc(sizeof(*p));
 
1787 static int update_clone_start_failure(struct strbuf *err,
 
1791         struct submodule_update_clone *suc = suc_cb;
 
1796 static int update_clone_task_finished(int result,
 
1801         const struct cache_entry *ce;
 
1802         struct submodule_update_clone *suc = suc_cb;
 
1804         int *idxP = idx_task_cb;
 
1811         if (idx < suc->list.nr) {
 
1812                 ce  = suc->list.entries[idx];
 
1813                 strbuf_addf(err, _("Failed to clone '%s'. Retry scheduled"),
 
1815                 strbuf_addch(err, '\n');
 
1816                 ALLOC_GROW(suc->failed_clones,
 
1817                            suc->failed_clones_nr + 1,
 
1818                            suc->failed_clones_alloc);
 
1819                 suc->failed_clones[suc->failed_clones_nr++] = ce;
 
1822                 idx -= suc->list.nr;
 
1823                 ce  = suc->failed_clones[idx];
 
1824                 strbuf_addf(err, _("Failed to clone '%s' a second time, aborting"),
 
1826                 strbuf_addch(err, '\n');
 
1834 static int git_update_clone_config(const char *var, const char *value,
 
1838         if (!strcmp(var, "submodule.fetchjobs"))
 
1839                 *max_jobs = parse_submodule_fetchjobs(var, value);
 
1843 static void update_submodule(struct update_clone_data *ucd)
 
1845         fprintf(stdout, "dummy %s %d\t%s\n",
 
1846                 oid_to_hex(&ucd->oid),
 
1851 static int update_submodules(struct submodule_update_clone *suc)
 
1855         run_processes_parallel_tr2(suc->max_jobs, update_clone_get_next_task,
 
1856                                    update_clone_start_failure,
 
1857                                    update_clone_task_finished, suc, "submodule",
 
1861          * We saved the output and put it out all at once now.
 
1863          * - the listener does not have to interleave their (checkout)
 
1864          *   work with our fetching.  The writes involved in a
 
1865          *   checkout involve more straightforward sequential I/O.
 
1866          * - the listener can avoid doing any work if fetching failed.
 
1871         for (i = 0; i < suc->update_clone_nr; i++)
 
1872                 update_submodule(&suc->update_clone[i]);
 
1877 static int update_clone(int argc, const char **argv, const char *prefix)
 
1879         const char *update = NULL;
 
1880         struct pathspec pathspec;
 
1881         struct submodule_update_clone suc = SUBMODULE_UPDATE_CLONE_INIT;
 
1883         struct option module_update_clone_options[] = {
 
1884                 OPT_STRING(0, "prefix", &prefix,
 
1886                            N_("path into the working tree")),
 
1887                 OPT_STRING(0, "recursive-prefix", &suc.recursive_prefix,
 
1889                            N_("path into the working tree, across nested "
 
1890                               "submodule boundaries")),
 
1891                 OPT_STRING(0, "update", &update,
 
1893                            N_("rebase, merge, checkout or none")),
 
1894                 OPT_STRING_LIST(0, "reference", &suc.references, N_("repo"),
 
1895                            N_("reference repository")),
 
1896                 OPT_BOOL(0, "dissociate", &suc.dissociate,
 
1897                            N_("use --reference only while cloning")),
 
1898                 OPT_STRING(0, "depth", &suc.depth, "<depth>",
 
1899                            N_("Create a shallow clone truncated to the "
 
1900                               "specified number of revisions")),
 
1901                 OPT_INTEGER('j', "jobs", &suc.max_jobs,
 
1902                             N_("parallel jobs")),
 
1903                 OPT_BOOL(0, "recommend-shallow", &suc.recommend_shallow,
 
1904                             N_("whether the initial clone should follow the shallow recommendation")),
 
1905                 OPT__QUIET(&suc.quiet, N_("don't print cloning progress")),
 
1906                 OPT_BOOL(0, "progress", &suc.progress,
 
1907                             N_("force cloning progress")),
 
1908                 OPT_BOOL(0, "require-init", &suc.require_init,
 
1909                            N_("disallow cloning into non-empty directory")),
 
1913         const char *const git_submodule_helper_usage[] = {
 
1914                 N_("git submodule--helper update-clone [--prefix=<path>] [<path>...]"),
 
1917         suc.prefix = prefix;
 
1919         update_clone_config_from_gitmodules(&suc.max_jobs);
 
1920         git_config(git_update_clone_config, &suc.max_jobs);
 
1922         argc = parse_options(argc, argv, prefix, module_update_clone_options,
 
1923                              git_submodule_helper_usage, 0);
 
1926                 if (parse_submodule_update_strategy(update, &suc.update) < 0)
 
1927                         die(_("bad value for update parameter"));
 
1929         if (module_list_compute(argc, argv, prefix, &pathspec, &suc.list) < 0)
 
1933                 suc.warn_if_uninitialized = 1;
 
1935         return update_submodules(&suc);
 
1938 static int resolve_relative_path(int argc, const char **argv, const char *prefix)
 
1940         struct strbuf sb = STRBUF_INIT;
 
1942                 die("submodule--helper relative-path takes exactly 2 arguments, got %d", argc);
 
1944         printf("%s", relative_path(argv[1], argv[2], &sb));
 
1945         strbuf_release(&sb);
 
1949 static const char *remote_submodule_branch(const char *path)
 
1951         const struct submodule *sub;
 
1952         const char *branch = NULL;
 
1955         sub = submodule_from_path(the_repository, &null_oid, path);
 
1959         key = xstrfmt("submodule.%s.branch", sub->name);
 
1960         if (repo_config_get_string_const(the_repository, key, &branch))
 
1961                 branch = sub->branch;
 
1967         if (!strcmp(branch, ".")) {
 
1968                 const char *refname = resolve_ref_unsafe("HEAD", 0, NULL, NULL);
 
1971                         die(_("No such ref: %s"), "HEAD");
 
1974                 if (!strcmp(refname, "HEAD"))
 
1975                         die(_("Submodule (%s) branch configured to inherit "
 
1976                               "branch from superproject, but the superproject "
 
1977                               "is not on any branch"), sub->name);
 
1979                 if (!skip_prefix(refname, "refs/heads/", &refname))
 
1980                         die(_("Expecting a full ref name, got %s"), refname);
 
1987 static int resolve_remote_submodule_branch(int argc, const char **argv,
 
1991         struct strbuf sb = STRBUF_INIT;
 
1993                 die("submodule--helper remote-branch takes exactly one arguments, got %d", argc);
 
1995         ret = remote_submodule_branch(argv[1]);
 
1997                 die("submodule %s doesn't exist", argv[1]);
 
2000         strbuf_release(&sb);
 
2004 static int push_check(int argc, const char **argv, const char *prefix)
 
2006         struct remote *remote;
 
2007         const char *superproject_head;
 
2009         int detached_head = 0;
 
2010         struct object_id head_oid;
 
2013                 die("submodule--helper push-check requires at least 2 arguments");
 
2016          * superproject's resolved head ref.
 
2017          * if HEAD then the superproject is in a detached head state, otherwise
 
2018          * it will be the resolved head ref.
 
2020         superproject_head = argv[1];
 
2023         /* Get the submodule's head ref and determine if it is detached */
 
2024         head = resolve_refdup("HEAD", 0, &head_oid, NULL);
 
2026                 die(_("Failed to resolve HEAD as a valid ref."));
 
2027         if (!strcmp(head, "HEAD"))
 
2031          * The remote must be configured.
 
2032          * This is to avoid pushing to the exact same URL as the parent.
 
2034         remote = pushremote_get(argv[1]);
 
2035         if (!remote || remote->origin == REMOTE_UNCONFIGURED)
 
2036                 die("remote '%s' not configured", argv[1]);
 
2038         /* Check the refspec */
 
2041                 struct ref *local_refs = get_local_heads();
 
2042                 struct refspec refspec = REFSPEC_INIT_PUSH;
 
2044                 refspec_appendn(&refspec, argv + 2, argc - 2);
 
2046                 for (i = 0; i < refspec.nr; i++) {
 
2047                         const struct refspec_item *rs = &refspec.items[i];
 
2049                         if (rs->pattern || rs->matching)
 
2052                         /* LHS must match a single ref */
 
2053                         switch (count_refspec_match(rs->src, local_refs, NULL)) {
 
2058                                  * If LHS matches 'HEAD' then we need to ensure
 
2059                                  * that it matches the same named branch
 
2060                                  * checked out in the superproject.
 
2062                                 if (!strcmp(rs->src, "HEAD")) {
 
2063                                         if (!detached_head &&
 
2064                                             !strcmp(head, superproject_head))
 
2066                                         die("HEAD does not match the named branch in the superproject");
 
2070                                 die("src refspec '%s' must name a ref",
 
2074                 refspec_clear(&refspec);
 
2081 static int ensure_core_worktree(int argc, const char **argv, const char *prefix)
 
2083         const struct submodule *sub;
 
2086         struct repository subrepo;
 
2089                 BUG("submodule--helper ensure-core-worktree <path>");
 
2093         sub = submodule_from_path(the_repository, &null_oid, path);
 
2095                 BUG("We could get the submodule handle before?");
 
2097         if (repo_submodule_init(&subrepo, the_repository, sub))
 
2098                 die(_("could not get a repository handle for submodule '%s'"), path);
 
2100         if (!repo_config_get_string(&subrepo, "core.worktree", &cw)) {
 
2101                 char *cfg_file, *abs_path;
 
2102                 const char *rel_path;
 
2103                 struct strbuf sb = STRBUF_INIT;
 
2105                 cfg_file = repo_git_path(&subrepo, "config");
 
2107                 abs_path = absolute_pathdup(path);
 
2108                 rel_path = relative_path(abs_path, subrepo.gitdir, &sb);
 
2110                 git_config_set_in_file(cfg_file, "core.worktree", rel_path);
 
2114                 strbuf_release(&sb);
 
2120 static int absorb_git_dirs(int argc, const char **argv, const char *prefix)
 
2123         struct pathspec pathspec;
 
2124         struct module_list list = MODULE_LIST_INIT;
 
2125         unsigned flags = ABSORB_GITDIR_RECURSE_SUBMODULES;
 
2127         struct option embed_gitdir_options[] = {
 
2128                 OPT_STRING(0, "prefix", &prefix,
 
2130                            N_("path into the working tree")),
 
2131                 OPT_BIT(0, "--recursive", &flags, N_("recurse into submodules"),
 
2132                         ABSORB_GITDIR_RECURSE_SUBMODULES),
 
2136         const char *const git_submodule_helper_usage[] = {
 
2137                 N_("git submodule--helper absorb-git-dirs [<options>] [<path>...]"),
 
2141         argc = parse_options(argc, argv, prefix, embed_gitdir_options,
 
2142                              git_submodule_helper_usage, 0);
 
2144         if (module_list_compute(argc, argv, prefix, &pathspec, &list) < 0)
 
2147         for (i = 0; i < list.nr; i++)
 
2148                 absorb_git_dir_into_superproject(list.entries[i]->name, flags);
 
2153 static int is_active(int argc, const char **argv, const char *prefix)
 
2156                 die("submodule--helper is-active takes exactly 1 argument");
 
2158         return !is_submodule_active(the_repository, argv[1]);
 
2162  * Exit non-zero if any of the submodule names given on the command line is
 
2163  * invalid. If no names are given, filter stdin to print only valid names
 
2164  * (which is primarily intended for testing).
 
2166 static int check_name(int argc, const char **argv, const char *prefix)
 
2170                         if (check_submodule_name(*argv) < 0)
 
2174                 struct strbuf buf = STRBUF_INIT;
 
2175                 while (strbuf_getline(&buf, stdin) != EOF) {
 
2176                         if (!check_submodule_name(buf.buf))
 
2177                                 printf("%s\n", buf.buf);
 
2179                 strbuf_release(&buf);
 
2184 static int module_config(int argc, const char **argv, const char *prefix)
 
2187                 CHECK_WRITEABLE = 1,
 
2191         struct option module_config_options[] = {
 
2192                 OPT_CMDMODE(0, "check-writeable", &command,
 
2193                             N_("check if it is safe to write to the .gitmodules file"),
 
2195                 OPT_CMDMODE(0, "unset", &command,
 
2196                             N_("unset the config in the .gitmodules file"),
 
2200         const char *const git_submodule_helper_usage[] = {
 
2201                 N_("git submodule--helper config <name> [<value>]"),
 
2202                 N_("git submodule--helper config --unset <name>"),
 
2203                 N_("git submodule--helper config --check-writeable"),
 
2207         argc = parse_options(argc, argv, prefix, module_config_options,
 
2208                              git_submodule_helper_usage, PARSE_OPT_KEEP_ARGV0);
 
2210         if (argc == 1 && command == CHECK_WRITEABLE)
 
2211                 return is_writing_gitmodules_ok() ? 0 : -1;
 
2213         /* Equivalent to ACTION_GET in builtin/config.c */
 
2214         if (argc == 2 && command != DO_UNSET)
 
2215                 return print_config_from_gitmodules(the_repository, argv[1]);
 
2217         /* Equivalent to ACTION_SET in builtin/config.c */
 
2218         if (argc == 3 || (argc == 2 && command == DO_UNSET)) {
 
2219                 const char *value = (argc == 3) ? argv[2] : NULL;
 
2221                 if (!is_writing_gitmodules_ok())
 
2222                         die(_("please make sure that the .gitmodules file is in the working tree"));
 
2224                 return config_set_in_gitmodules_file_gently(argv[1], value);
 
2227         usage_with_options(git_submodule_helper_usage, module_config_options);
 
2230 #define SUPPORT_SUPER_PREFIX (1<<0)
 
2234         int (*fn)(int, const char **, const char *);
 
2238 static struct cmd_struct commands[] = {
 
2239         {"list", module_list, 0},
 
2240         {"name", module_name, 0},
 
2241         {"clone", module_clone, 0},
 
2242         {"update-module-mode", module_update_module_mode, 0},
 
2243         {"update-clone", update_clone, 0},
 
2244         {"ensure-core-worktree", ensure_core_worktree, 0},
 
2245         {"relative-path", resolve_relative_path, 0},
 
2246         {"resolve-relative-url", resolve_relative_url, 0},
 
2247         {"resolve-relative-url-test", resolve_relative_url_test, 0},
 
2248         {"foreach", module_foreach, SUPPORT_SUPER_PREFIX},
 
2249         {"init", module_init, SUPPORT_SUPER_PREFIX},
 
2250         {"status", module_status, SUPPORT_SUPER_PREFIX},
 
2251         {"print-default-remote", print_default_remote, 0},
 
2252         {"sync", module_sync, SUPPORT_SUPER_PREFIX},
 
2253         {"deinit", module_deinit, 0},
 
2254         {"remote-branch", resolve_remote_submodule_branch, 0},
 
2255         {"push-check", push_check, 0},
 
2256         {"absorb-git-dirs", absorb_git_dirs, SUPPORT_SUPER_PREFIX},
 
2257         {"is-active", is_active, 0},
 
2258         {"check-name", check_name, 0},
 
2259         {"config", module_config, 0},
 
2262 int cmd_submodule__helper(int argc, const char **argv, const char *prefix)
 
2265         if (argc < 2 || !strcmp(argv[1], "-h"))
 
2266                 usage("git submodule--helper <command>");
 
2268         for (i = 0; i < ARRAY_SIZE(commands); i++) {
 
2269                 if (!strcmp(argv[1], commands[i].cmd)) {
 
2270                         if (get_super_prefix() &&
 
2271                             !(commands[i].option & SUPPORT_SUPER_PREFIX))
 
2272                                 die(_("%s doesn't support --super-prefix"),
 
2274                         return commands[i].fn(argc - 1, argv + 1, prefix);
 
2278         die(_("'%s' is not a valid submodule--helper "
 
2279               "subcommand"), argv[1]);