1 #define USE_THE_INDEX_COMPATIBILITY_MACROS
2 #include "builtin.h"
3 #include "repository.h"
4 #include "cache.h"
5 #include "config.h"
6 #include "parse-options.h"
7 #include "quote.h"
8 #include "pathspec.h"
9 #include "dir.h"
10 #include "submodule.h"
11 #include "submodule-config.h"
12 #include "string-list.h"
13 #include "run-command.h"
14 #include "remote.h"
15 #include "refs.h"
16 #include "refspec.h"
17 #include "connect.h"
18 #include "revision.h"
19 #include "diffcore.h"
20 #include "diff.h"
21 #include "object-store.h"
22 #include "advice.h"
23 
24 #define OPT_QUIET (1 << 0)
25 #define OPT_CACHED (1 << 1)
26 #define OPT_RECURSIVE (1 << 2)
27 #define OPT_FORCE (1 << 3)
28 
29 typedef void (*each_submodule_fn)(const struct cache_entry *list_item,
30 				  void *cb_data);
31 
get_default_remote(void)32 static char *get_default_remote(void)
33 {
34 	char *dest = NULL, *ret;
35 	struct strbuf sb = STRBUF_INIT;
36 	const char *refname = resolve_ref_unsafe("HEAD", 0, NULL, NULL);
37 
38 	if (!refname)
39 		die(_("No such ref: %s"), "HEAD");
40 
41 	/* detached HEAD */
42 	if (!strcmp(refname, "HEAD"))
43 		return xstrdup("origin");
44 
45 	if (!skip_prefix(refname, "refs/heads/", &refname))
46 		die(_("Expecting a full ref name, got %s"), refname);
47 
48 	strbuf_addf(&sb, "branch.%s.remote", refname);
49 	if (git_config_get_string(sb.buf, &dest))
50 		ret = xstrdup("origin");
51 	else
52 		ret = dest;
53 
54 	strbuf_release(&sb);
55 	return ret;
56 }
57 
print_default_remote(int argc,const char ** argv,const char * prefix)58 static int print_default_remote(int argc, const char **argv, const char *prefix)
59 {
60 	char *remote;
61 
62 	if (argc != 1)
63 		die(_("submodule--helper print-default-remote takes no arguments"));
64 
65 	remote = get_default_remote();
66 	if (remote)
67 		printf("%s\n", remote);
68 
69 	free(remote);
70 	return 0;
71 }
72 
starts_with_dot_slash(const char * str)73 static int starts_with_dot_slash(const char *str)
74 {
75 	return str[0] == '.' && is_dir_sep(str[1]);
76 }
77 
starts_with_dot_dot_slash(const char * str)78 static int starts_with_dot_dot_slash(const char *str)
79 {
80 	return str[0] == '.' && str[1] == '.' && is_dir_sep(str[2]);
81 }
82 
83 /*
84  * Returns 1 if it was the last chop before ':'.
85  */
chop_last_dir(char ** remoteurl,int is_relative)86 static int chop_last_dir(char **remoteurl, int is_relative)
87 {
88 	char *rfind = find_last_dir_sep(*remoteurl);
89 	if (rfind) {
90 		*rfind = '\0';
91 		return 0;
92 	}
93 
94 	rfind = strrchr(*remoteurl, ':');
95 	if (rfind) {
96 		*rfind = '\0';
97 		return 1;
98 	}
99 
100 	if (is_relative || !strcmp(".", *remoteurl))
101 		die(_("cannot strip one component off url '%s'"),
102 			*remoteurl);
103 
104 	free(*remoteurl);
105 	*remoteurl = xstrdup(".");
106 	return 0;
107 }
108 
109 /*
110  * The `url` argument is the URL that navigates to the submodule origin
111  * repo. When relative, this URL is relative to the superproject origin
112  * URL repo. The `up_path` argument, if specified, is the relative
113  * path that navigates from the submodule working tree to the superproject
114  * working tree. Returns the origin URL of the submodule.
115  *
116  * Return either an absolute URL or filesystem path (if the superproject
117  * origin URL is an absolute URL or filesystem path, respectively) or a
118  * relative file system path (if the superproject origin URL is a relative
119  * file system path).
120  *
121  * When the output is a relative file system path, the path is either
122  * relative to the submodule working tree, if up_path is specified, or to
123  * the superproject working tree otherwise.
124  *
125  * NEEDSWORK: This works incorrectly on the domain and protocol part.
126  * remote_url      url              outcome          expectation
127  * http://a.com/b  ../c             http://a.com/c   as is
128  * http://a.com/b/ ../c             http://a.com/c   same as previous line, but
129  *                                                   ignore trailing slash in url
130  * http://a.com/b  ../../c          http://c         error out
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    .:c           error out
134  * NEEDSWORK: Given how chop_last_dir() works, this function is broken
135  * when a local part has a colon in its path component, too.
136  */
relative_url(const char * remote_url,const char * url,const char * up_path)137 static char *relative_url(const char *remote_url,
138 				const char *url,
139 				const char *up_path)
140 {
141 	int is_relative = 0;
142 	int colonsep = 0;
143 	char *out;
144 	char *remoteurl = xstrdup(remote_url);
145 	struct strbuf sb = STRBUF_INIT;
146 	size_t len = strlen(remoteurl);
147 
148 	if (is_dir_sep(remoteurl[len-1]))
149 		remoteurl[len-1] = '\0';
150 
151 	if (!url_is_local_not_ssh(remoteurl) || is_absolute_path(remoteurl))
152 		is_relative = 0;
153 	else {
154 		is_relative = 1;
155 		/*
156 		 * Prepend a './' to ensure all relative
157 		 * remoteurls start with './' or '../'
158 		 */
159 		if (!starts_with_dot_slash(remoteurl) &&
160 		    !starts_with_dot_dot_slash(remoteurl)) {
161 			strbuf_reset(&sb);
162 			strbuf_addf(&sb, "./%s", remoteurl);
163 			free(remoteurl);
164 			remoteurl = strbuf_detach(&sb, NULL);
165 		}
166 	}
167 	/*
168 	 * When the url starts with '../', remove that and the
169 	 * last directory in remoteurl.
170 	 */
171 	while (url) {
172 		if (starts_with_dot_dot_slash(url)) {
173 			url += 3;
174 			colonsep |= chop_last_dir(&remoteurl, is_relative);
175 		} else if (starts_with_dot_slash(url))
176 			url += 2;
177 		else
178 			break;
179 	}
180 	strbuf_reset(&sb);
181 	strbuf_addf(&sb, "%s%s%s", remoteurl, colonsep ? ":" : "/", url);
182 	if (ends_with(url, "/"))
183 		strbuf_setlen(&sb, sb.len - 1);
184 	free(remoteurl);
185 
186 	if (starts_with_dot_slash(sb.buf))
187 		out = xstrdup(sb.buf + 2);
188 	else
189 		out = xstrdup(sb.buf);
190 
191 	if (!up_path || !is_relative) {
192 		strbuf_release(&sb);
193 		return out;
194 	}
195 
196 	strbuf_reset(&sb);
197 	strbuf_addf(&sb, "%s%s", up_path, out);
198 	free(out);
199 	return strbuf_detach(&sb, NULL);
200 }
201 
resolve_relative_url(const char * rel_url,const char * up_path,int quiet)202 static char *resolve_relative_url(const char *rel_url, const char *up_path, int quiet)
203 {
204 	char *remoteurl, *resolved_url;
205 	char *remote = get_default_remote();
206 	struct strbuf remotesb = STRBUF_INIT;
207 
208 	strbuf_addf(&remotesb, "remote.%s.url", remote);
209 	if (git_config_get_string(remotesb.buf, &remoteurl)) {
210 		if (!quiet)
211 			warning(_("could not look up configuration '%s'. "
212 				  "Assuming this repository is its own "
213 				  "authoritative upstream."),
214 				remotesb.buf);
215 		remoteurl = xgetcwd();
216 	}
217 	resolved_url = relative_url(remoteurl, rel_url, up_path);
218 
219 	free(remote);
220 	free(remoteurl);
221 	strbuf_release(&remotesb);
222 
223 	return resolved_url;
224 }
225 
resolve_relative_url_test(int argc,const char ** argv,const char * prefix)226 static int resolve_relative_url_test(int argc, const char **argv, const char *prefix)
227 {
228 	char *remoteurl, *res;
229 	const char *up_path, *url;
230 
231 	if (argc != 4)
232 		die("resolve-relative-url-test only accepts three arguments: <up_path> <remoteurl> <url>");
233 
234 	up_path = argv[1];
235 	remoteurl = xstrdup(argv[2]);
236 	url = argv[3];
237 
238 	if (!strcmp(up_path, "(null)"))
239 		up_path = NULL;
240 
241 	res = relative_url(remoteurl, url, up_path);
242 	puts(res);
243 	free(res);
244 	free(remoteurl);
245 	return 0;
246 }
247 
248 /* the result should be freed by the caller. */
get_submodule_displaypath(const char * path,const char * prefix)249 static char *get_submodule_displaypath(const char *path, const char *prefix)
250 {
251 	const char *super_prefix = get_super_prefix();
252 
253 	if (prefix && super_prefix) {
254 		BUG("cannot have prefix '%s' and superprefix '%s'",
255 		    prefix, super_prefix);
256 	} else if (prefix) {
257 		struct strbuf sb = STRBUF_INIT;
258 		char *displaypath = xstrdup(relative_path(path, prefix, &sb));
259 		strbuf_release(&sb);
260 		return displaypath;
261 	} else if (super_prefix) {
262 		return xstrfmt("%s%s", super_prefix, path);
263 	} else {
264 		return xstrdup(path);
265 	}
266 }
267 
compute_rev_name(const char * sub_path,const char * object_id)268 static char *compute_rev_name(const char *sub_path, const char* object_id)
269 {
270 	struct strbuf sb = STRBUF_INIT;
271 	const char ***d;
272 
273 	static const char *describe_bare[] = { NULL };
274 
275 	static const char *describe_tags[] = { "--tags", NULL };
276 
277 	static const char *describe_contains[] = { "--contains", NULL };
278 
279 	static const char *describe_all_always[] = { "--all", "--always", NULL };
280 
281 	static const char **describe_argv[] = { describe_bare, describe_tags,
282 						describe_contains,
283 						describe_all_always, NULL };
284 
285 	for (d = describe_argv; *d; d++) {
286 		struct child_process cp = CHILD_PROCESS_INIT;
287 		prepare_submodule_repo_env(&cp.env_array);
288 		cp.dir = sub_path;
289 		cp.git_cmd = 1;
290 		cp.no_stderr = 1;
291 
292 		strvec_push(&cp.args, "describe");
293 		strvec_pushv(&cp.args, *d);
294 		strvec_push(&cp.args, object_id);
295 
296 		if (!capture_command(&cp, &sb, 0)) {
297 			strbuf_strip_suffix(&sb, "\n");
298 			return strbuf_detach(&sb, NULL);
299 		}
300 	}
301 
302 	strbuf_release(&sb);
303 	return NULL;
304 }
305 
306 struct module_list {
307 	const struct cache_entry **entries;
308 	int alloc, nr;
309 };
310 #define MODULE_LIST_INIT { 0 }
311 
module_list_compute(int argc,const char ** argv,const char * prefix,struct pathspec * pathspec,struct module_list * list)312 static int module_list_compute(int argc, const char **argv,
313 			       const char *prefix,
314 			       struct pathspec *pathspec,
315 			       struct module_list *list)
316 {
317 	int i, result = 0;
318 	char *ps_matched = NULL;
319 	parse_pathspec(pathspec, 0,
320 		       PATHSPEC_PREFER_FULL,
321 		       prefix, argv);
322 
323 	if (pathspec->nr)
324 		ps_matched = xcalloc(pathspec->nr, 1);
325 
326 	if (read_cache() < 0)
327 		die(_("index file corrupt"));
328 
329 	for (i = 0; i < active_nr; i++) {
330 		const struct cache_entry *ce = active_cache[i];
331 
332 		if (!match_pathspec(&the_index, pathspec, ce->name, ce_namelen(ce),
333 				    0, ps_matched, 1) ||
334 		    !S_ISGITLINK(ce->ce_mode))
335 			continue;
336 
337 		ALLOC_GROW(list->entries, list->nr + 1, list->alloc);
338 		list->entries[list->nr++] = ce;
339 		while (i + 1 < active_nr &&
340 		       !strcmp(ce->name, active_cache[i + 1]->name))
341 			/*
342 			 * Skip entries with the same name in different stages
343 			 * to make sure an entry is returned only once.
344 			 */
345 			i++;
346 	}
347 
348 	if (ps_matched && report_path_error(ps_matched, pathspec))
349 		result = -1;
350 
351 	free(ps_matched);
352 
353 	return result;
354 }
355 
module_list_active(struct module_list * list)356 static void module_list_active(struct module_list *list)
357 {
358 	int i;
359 	struct module_list active_modules = MODULE_LIST_INIT;
360 
361 	for (i = 0; i < list->nr; i++) {
362 		const struct cache_entry *ce = list->entries[i];
363 
364 		if (!is_submodule_active(the_repository, ce->name))
365 			continue;
366 
367 		ALLOC_GROW(active_modules.entries,
368 			   active_modules.nr + 1,
369 			   active_modules.alloc);
370 		active_modules.entries[active_modules.nr++] = ce;
371 	}
372 
373 	free(list->entries);
374 	*list = active_modules;
375 }
376 
get_up_path(const char * path)377 static char *get_up_path(const char *path)
378 {
379 	int i;
380 	struct strbuf sb = STRBUF_INIT;
381 
382 	for (i = count_slashes(path); i; i--)
383 		strbuf_addstr(&sb, "../");
384 
385 	/*
386 	 * Check if 'path' ends with slash or not
387 	 * for having the same output for dir/sub_dir
388 	 * and dir/sub_dir/
389 	 */
390 	if (!is_dir_sep(path[strlen(path) - 1]))
391 		strbuf_addstr(&sb, "../");
392 
393 	return strbuf_detach(&sb, NULL);
394 }
395 
module_list(int argc,const char ** argv,const char * prefix)396 static int module_list(int argc, const char **argv, const char *prefix)
397 {
398 	int i;
399 	struct pathspec pathspec;
400 	struct module_list list = MODULE_LIST_INIT;
401 
402 	struct option module_list_options[] = {
403 		OPT_STRING(0, "prefix", &prefix,
404 			   N_("path"),
405 			   N_("alternative anchor for relative paths")),
406 		OPT_END()
407 	};
408 
409 	const char *const git_submodule_helper_usage[] = {
410 		N_("git submodule--helper list [--prefix=<path>] [<path>...]"),
411 		NULL
412 	};
413 
414 	argc = parse_options(argc, argv, prefix, module_list_options,
415 			     git_submodule_helper_usage, 0);
416 
417 	if (module_list_compute(argc, argv, prefix, &pathspec, &list) < 0)
418 		return 1;
419 
420 	for (i = 0; i < list.nr; i++) {
421 		const struct cache_entry *ce = list.entries[i];
422 
423 		if (ce_stage(ce))
424 			printf("%06o %s U\t", ce->ce_mode,
425 			       oid_to_hex(null_oid()));
426 		else
427 			printf("%06o %s %d\t", ce->ce_mode,
428 			       oid_to_hex(&ce->oid), ce_stage(ce));
429 
430 		fprintf(stdout, "%s\n", ce->name);
431 	}
432 	return 0;
433 }
434 
for_each_listed_submodule(const struct module_list * list,each_submodule_fn fn,void * cb_data)435 static void for_each_listed_submodule(const struct module_list *list,
436 				      each_submodule_fn fn, void *cb_data)
437 {
438 	int i;
439 	for (i = 0; i < list->nr; i++)
440 		fn(list->entries[i], cb_data);
441 }
442 
443 struct foreach_cb {
444 	int argc;
445 	const char **argv;
446 	const char *prefix;
447 	int quiet;
448 	int recursive;
449 };
450 #define FOREACH_CB_INIT { 0 }
451 
runcommand_in_submodule_cb(const struct cache_entry * list_item,void * cb_data)452 static void runcommand_in_submodule_cb(const struct cache_entry *list_item,
453 				       void *cb_data)
454 {
455 	struct foreach_cb *info = cb_data;
456 	const char *path = list_item->name;
457 	const struct object_id *ce_oid = &list_item->oid;
458 
459 	const struct submodule *sub;
460 	struct child_process cp = CHILD_PROCESS_INIT;
461 	char *displaypath;
462 
463 	displaypath = get_submodule_displaypath(path, info->prefix);
464 
465 	sub = submodule_from_path(the_repository, null_oid(), path);
466 
467 	if (!sub)
468 		die(_("No url found for submodule path '%s' in .gitmodules"),
469 			displaypath);
470 
471 	if (!is_submodule_populated_gently(path, NULL))
472 		goto cleanup;
473 
474 	prepare_submodule_repo_env(&cp.env_array);
475 
476 	/*
477 	 * For the purpose of executing <command> in the submodule,
478 	 * separate shell is used for the purpose of running the
479 	 * child process.
480 	 */
481 	cp.use_shell = 1;
482 	cp.dir = path;
483 
484 	/*
485 	 * NEEDSWORK: the command currently has access to the variables $name,
486 	 * $sm_path, $displaypath, $sha1 and $toplevel only when the command
487 	 * contains a single argument. This is done for maintaining a faithful
488 	 * translation from shell script.
489 	 */
490 	if (info->argc == 1) {
491 		char *toplevel = xgetcwd();
492 		struct strbuf sb = STRBUF_INIT;
493 
494 		strvec_pushf(&cp.env_array, "name=%s", sub->name);
495 		strvec_pushf(&cp.env_array, "sm_path=%s", path);
496 		strvec_pushf(&cp.env_array, "displaypath=%s", displaypath);
497 		strvec_pushf(&cp.env_array, "sha1=%s",
498 			     oid_to_hex(ce_oid));
499 		strvec_pushf(&cp.env_array, "toplevel=%s", toplevel);
500 
501 		/*
502 		 * Since the path variable was accessible from the script
503 		 * before porting, it is also made available after porting.
504 		 * The environment variable "PATH" has a very special purpose
505 		 * on windows. And since environment variables are
506 		 * case-insensitive in windows, it interferes with the
507 		 * existing PATH variable. Hence, to avoid that, we expose
508 		 * path via the args strvec and not via env_array.
509 		 */
510 		sq_quote_buf(&sb, path);
511 		strvec_pushf(&cp.args, "path=%s; %s",
512 			     sb.buf, info->argv[0]);
513 		strbuf_release(&sb);
514 		free(toplevel);
515 	} else {
516 		strvec_pushv(&cp.args, info->argv);
517 	}
518 
519 	if (!info->quiet)
520 		printf(_("Entering '%s'\n"), displaypath);
521 
522 	if (info->argv[0] && run_command(&cp))
523 		die(_("run_command returned non-zero status for %s\n."),
524 			displaypath);
525 
526 	if (info->recursive) {
527 		struct child_process cpr = CHILD_PROCESS_INIT;
528 
529 		cpr.git_cmd = 1;
530 		cpr.dir = path;
531 		prepare_submodule_repo_env(&cpr.env_array);
532 
533 		strvec_pushl(&cpr.args, "--super-prefix", NULL);
534 		strvec_pushf(&cpr.args, "%s/", displaypath);
535 		strvec_pushl(&cpr.args, "submodule--helper", "foreach", "--recursive",
536 			     NULL);
537 
538 		if (info->quiet)
539 			strvec_push(&cpr.args, "--quiet");
540 
541 		strvec_push(&cpr.args, "--");
542 		strvec_pushv(&cpr.args, info->argv);
543 
544 		if (run_command(&cpr))
545 			die(_("run_command returned non-zero status while "
546 				"recursing in the nested submodules of %s\n."),
547 				displaypath);
548 	}
549 
550 cleanup:
551 	free(displaypath);
552 }
553 
module_foreach(int argc,const char ** argv,const char * prefix)554 static int module_foreach(int argc, const char **argv, const char *prefix)
555 {
556 	struct foreach_cb info = FOREACH_CB_INIT;
557 	struct pathspec pathspec;
558 	struct module_list list = MODULE_LIST_INIT;
559 
560 	struct option module_foreach_options[] = {
561 		OPT__QUIET(&info.quiet, N_("suppress output of entering each submodule command")),
562 		OPT_BOOL(0, "recursive", &info.recursive,
563 			 N_("recurse into nested submodules")),
564 		OPT_END()
565 	};
566 
567 	const char *const git_submodule_helper_usage[] = {
568 		N_("git submodule--helper foreach [--quiet] [--recursive] [--] <command>"),
569 		NULL
570 	};
571 
572 	argc = parse_options(argc, argv, prefix, module_foreach_options,
573 			     git_submodule_helper_usage, 0);
574 
575 	if (module_list_compute(0, NULL, prefix, &pathspec, &list) < 0)
576 		return 1;
577 
578 	info.argc = argc;
579 	info.argv = argv;
580 	info.prefix = prefix;
581 
582 	for_each_listed_submodule(&list, runcommand_in_submodule_cb, &info);
583 
584 	return 0;
585 }
586 
587 struct init_cb {
588 	const char *prefix;
589 	unsigned int flags;
590 };
591 #define INIT_CB_INIT { 0 }
592 
init_submodule(const char * path,const char * prefix,unsigned int flags)593 static void init_submodule(const char *path, const char *prefix,
594 			   unsigned int flags)
595 {
596 	const struct submodule *sub;
597 	struct strbuf sb = STRBUF_INIT;
598 	char *upd = NULL, *url = NULL, *displaypath;
599 
600 	displaypath = get_submodule_displaypath(path, prefix);
601 
602 	sub = submodule_from_path(the_repository, null_oid(), path);
603 
604 	if (!sub)
605 		die(_("No url found for submodule path '%s' in .gitmodules"),
606 			displaypath);
607 
608 	/*
609 	 * NEEDSWORK: In a multi-working-tree world, this needs to be
610 	 * set in the per-worktree config.
611 	 *
612 	 * Set active flag for the submodule being initialized
613 	 */
614 	if (!is_submodule_active(the_repository, path)) {
615 		strbuf_addf(&sb, "submodule.%s.active", sub->name);
616 		git_config_set_gently(sb.buf, "true");
617 		strbuf_reset(&sb);
618 	}
619 
620 	/*
621 	 * Copy url setting when it is not set yet.
622 	 * To look up the url in .git/config, we must not fall back to
623 	 * .gitmodules, so look it up directly.
624 	 */
625 	strbuf_addf(&sb, "submodule.%s.url", sub->name);
626 	if (git_config_get_string(sb.buf, &url)) {
627 		if (!sub->url)
628 			die(_("No url found for submodule path '%s' in .gitmodules"),
629 				displaypath);
630 
631 		url = xstrdup(sub->url);
632 
633 		/* Possibly a url relative to parent */
634 		if (starts_with_dot_dot_slash(url) ||
635 		    starts_with_dot_slash(url)) {
636 			char *oldurl = url;
637 			url = resolve_relative_url(oldurl, NULL, 0);
638 			free(oldurl);
639 		}
640 
641 		if (git_config_set_gently(sb.buf, url))
642 			die(_("Failed to register url for submodule path '%s'"),
643 			    displaypath);
644 		if (!(flags & OPT_QUIET))
645 			fprintf(stderr,
646 				_("Submodule '%s' (%s) registered for path '%s'\n"),
647 				sub->name, url, displaypath);
648 	}
649 	strbuf_reset(&sb);
650 
651 	/* Copy "update" setting when it is not set yet */
652 	strbuf_addf(&sb, "submodule.%s.update", sub->name);
653 	if (git_config_get_string(sb.buf, &upd) &&
654 	    sub->update_strategy.type != SM_UPDATE_UNSPECIFIED) {
655 		if (sub->update_strategy.type == SM_UPDATE_COMMAND) {
656 			fprintf(stderr, _("warning: command update mode suggested for submodule '%s'\n"),
657 				sub->name);
658 			upd = xstrdup("none");
659 		} else
660 			upd = xstrdup(submodule_strategy_to_string(&sub->update_strategy));
661 
662 		if (git_config_set_gently(sb.buf, upd))
663 			die(_("Failed to register update mode for submodule path '%s'"), displaypath);
664 	}
665 	strbuf_release(&sb);
666 	free(displaypath);
667 	free(url);
668 	free(upd);
669 }
670 
init_submodule_cb(const struct cache_entry * list_item,void * cb_data)671 static void init_submodule_cb(const struct cache_entry *list_item, void *cb_data)
672 {
673 	struct init_cb *info = cb_data;
674 	init_submodule(list_item->name, info->prefix, info->flags);
675 }
676 
module_init(int argc,const char ** argv,const char * prefix)677 static int module_init(int argc, const char **argv, const char *prefix)
678 {
679 	struct init_cb info = INIT_CB_INIT;
680 	struct pathspec pathspec;
681 	struct module_list list = MODULE_LIST_INIT;
682 	int quiet = 0;
683 
684 	struct option module_init_options[] = {
685 		OPT__QUIET(&quiet, N_("suppress output for initializing a submodule")),
686 		OPT_END()
687 	};
688 
689 	const char *const git_submodule_helper_usage[] = {
690 		N_("git submodule--helper init [<options>] [<path>]"),
691 		NULL
692 	};
693 
694 	argc = parse_options(argc, argv, prefix, module_init_options,
695 			     git_submodule_helper_usage, 0);
696 
697 	if (module_list_compute(argc, argv, prefix, &pathspec, &list) < 0)
698 		return 1;
699 
700 	/*
701 	 * If there are no path args and submodule.active is set then,
702 	 * by default, only initialize 'active' modules.
703 	 */
704 	if (!argc && git_config_get_value_multi("submodule.active"))
705 		module_list_active(&list);
706 
707 	info.prefix = prefix;
708 	if (quiet)
709 		info.flags |= OPT_QUIET;
710 
711 	for_each_listed_submodule(&list, init_submodule_cb, &info);
712 
713 	return 0;
714 }
715 
716 struct status_cb {
717 	const char *prefix;
718 	unsigned int flags;
719 };
720 #define STATUS_CB_INIT { 0 }
721 
print_status(unsigned int flags,char state,const char * path,const struct object_id * oid,const char * displaypath)722 static void print_status(unsigned int flags, char state, const char *path,
723 			 const struct object_id *oid, const char *displaypath)
724 {
725 	if (flags & OPT_QUIET)
726 		return;
727 
728 	printf("%c%s %s", state, oid_to_hex(oid), displaypath);
729 
730 	if (state == ' ' || state == '+') {
731 		const char *name = compute_rev_name(path, oid_to_hex(oid));
732 
733 		if (name)
734 			printf(" (%s)", name);
735 	}
736 
737 	printf("\n");
738 }
739 
handle_submodule_head_ref(const char * refname,const struct object_id * oid,int flags,void * cb_data)740 static int handle_submodule_head_ref(const char *refname,
741 				     const struct object_id *oid, int flags,
742 				     void *cb_data)
743 {
744 	struct object_id *output = cb_data;
745 	if (oid)
746 		oidcpy(output, oid);
747 
748 	return 0;
749 }
750 
status_submodule(const char * path,const struct object_id * ce_oid,unsigned int ce_flags,const char * prefix,unsigned int flags)751 static void status_submodule(const char *path, const struct object_id *ce_oid,
752 			     unsigned int ce_flags, const char *prefix,
753 			     unsigned int flags)
754 {
755 	char *displaypath;
756 	struct strvec diff_files_args = STRVEC_INIT;
757 	struct rev_info rev;
758 	int diff_files_result;
759 	struct strbuf buf = STRBUF_INIT;
760 	const char *git_dir;
761 
762 	if (!submodule_from_path(the_repository, null_oid(), path))
763 		die(_("no submodule mapping found in .gitmodules for path '%s'"),
764 		      path);
765 
766 	displaypath = get_submodule_displaypath(path, prefix);
767 
768 	if ((CE_STAGEMASK & ce_flags) >> CE_STAGESHIFT) {
769 		print_status(flags, 'U', path, null_oid(), displaypath);
770 		goto cleanup;
771 	}
772 
773 	strbuf_addf(&buf, "%s/.git", path);
774 	git_dir = read_gitfile(buf.buf);
775 	if (!git_dir)
776 		git_dir = buf.buf;
777 
778 	if (!is_submodule_active(the_repository, path) ||
779 	    !is_git_directory(git_dir)) {
780 		print_status(flags, '-', path, ce_oid, displaypath);
781 		strbuf_release(&buf);
782 		goto cleanup;
783 	}
784 	strbuf_release(&buf);
785 
786 	strvec_pushl(&diff_files_args, "diff-files",
787 		     "--ignore-submodules=dirty", "--quiet", "--",
788 		     path, NULL);
789 
790 	git_config(git_diff_basic_config, NULL);
791 
792 	repo_init_revisions(the_repository, &rev, NULL);
793 	rev.abbrev = 0;
794 	diff_files_args.nr = setup_revisions(diff_files_args.nr,
795 					     diff_files_args.v,
796 					     &rev, NULL);
797 	diff_files_result = run_diff_files(&rev, 0);
798 
799 	if (!diff_result_code(&rev.diffopt, diff_files_result)) {
800 		print_status(flags, ' ', path, ce_oid,
801 			     displaypath);
802 	} else if (!(flags & OPT_CACHED)) {
803 		struct object_id oid;
804 		struct ref_store *refs = get_submodule_ref_store(path);
805 
806 		if (!refs) {
807 			print_status(flags, '-', path, ce_oid, displaypath);
808 			goto cleanup;
809 		}
810 		if (refs_head_ref(refs, handle_submodule_head_ref, &oid))
811 			die(_("could not resolve HEAD ref inside the "
812 			      "submodule '%s'"), path);
813 
814 		print_status(flags, '+', path, &oid, displaypath);
815 	} else {
816 		print_status(flags, '+', path, ce_oid, displaypath);
817 	}
818 
819 	if (flags & OPT_RECURSIVE) {
820 		struct child_process cpr = CHILD_PROCESS_INIT;
821 
822 		cpr.git_cmd = 1;
823 		cpr.dir = path;
824 		prepare_submodule_repo_env(&cpr.env_array);
825 
826 		strvec_push(&cpr.args, "--super-prefix");
827 		strvec_pushf(&cpr.args, "%s/", displaypath);
828 		strvec_pushl(&cpr.args, "submodule--helper", "status",
829 			     "--recursive", NULL);
830 
831 		if (flags & OPT_CACHED)
832 			strvec_push(&cpr.args, "--cached");
833 
834 		if (flags & OPT_QUIET)
835 			strvec_push(&cpr.args, "--quiet");
836 
837 		if (run_command(&cpr))
838 			die(_("failed to recurse into submodule '%s'"), path);
839 	}
840 
841 cleanup:
842 	strvec_clear(&diff_files_args);
843 	free(displaypath);
844 }
845 
status_submodule_cb(const struct cache_entry * list_item,void * cb_data)846 static void status_submodule_cb(const struct cache_entry *list_item,
847 				void *cb_data)
848 {
849 	struct status_cb *info = cb_data;
850 	status_submodule(list_item->name, &list_item->oid, list_item->ce_flags,
851 			 info->prefix, info->flags);
852 }
853 
module_status(int argc,const char ** argv,const char * prefix)854 static int module_status(int argc, const char **argv, const char *prefix)
855 {
856 	struct status_cb info = STATUS_CB_INIT;
857 	struct pathspec pathspec;
858 	struct module_list list = MODULE_LIST_INIT;
859 	int quiet = 0;
860 
861 	struct option module_status_options[] = {
862 		OPT__QUIET(&quiet, N_("suppress submodule status output")),
863 		OPT_BIT(0, "cached", &info.flags, N_("use commit stored in the index instead of the one stored in the submodule HEAD"), OPT_CACHED),
864 		OPT_BIT(0, "recursive", &info.flags, N_("recurse into nested submodules"), OPT_RECURSIVE),
865 		OPT_END()
866 	};
867 
868 	const char *const git_submodule_helper_usage[] = {
869 		N_("git submodule status [--quiet] [--cached] [--recursive] [<path>...]"),
870 		NULL
871 	};
872 
873 	argc = parse_options(argc, argv, prefix, module_status_options,
874 			     git_submodule_helper_usage, 0);
875 
876 	if (module_list_compute(argc, argv, prefix, &pathspec, &list) < 0)
877 		return 1;
878 
879 	info.prefix = prefix;
880 	if (quiet)
881 		info.flags |= OPT_QUIET;
882 
883 	for_each_listed_submodule(&list, status_submodule_cb, &info);
884 
885 	return 0;
886 }
887 
module_name(int argc,const char ** argv,const char * prefix)888 static int module_name(int argc, const char **argv, const char *prefix)
889 {
890 	const struct submodule *sub;
891 
892 	if (argc != 2)
893 		usage(_("git submodule--helper name <path>"));
894 
895 	sub = submodule_from_path(the_repository, null_oid(), argv[1]);
896 
897 	if (!sub)
898 		die(_("no submodule mapping found in .gitmodules for path '%s'"),
899 		    argv[1]);
900 
901 	printf("%s\n", sub->name);
902 
903 	return 0;
904 }
905 
906 struct module_cb {
907 	unsigned int mod_src;
908 	unsigned int mod_dst;
909 	struct object_id oid_src;
910 	struct object_id oid_dst;
911 	char status;
912 	const char *sm_path;
913 };
914 #define MODULE_CB_INIT { 0 }
915 
916 struct module_cb_list {
917 	struct module_cb **entries;
918 	int alloc, nr;
919 };
920 #define MODULE_CB_LIST_INIT { 0 }
921 
922 struct summary_cb {
923 	int argc;
924 	const char **argv;
925 	const char *prefix;
926 	unsigned int cached: 1;
927 	unsigned int for_status: 1;
928 	unsigned int files: 1;
929 	int summary_limit;
930 };
931 #define SUMMARY_CB_INIT { 0 }
932 
933 enum diff_cmd {
934 	DIFF_INDEX,
935 	DIFF_FILES
936 };
937 
verify_submodule_committish(const char * sm_path,const char * committish)938 static char *verify_submodule_committish(const char *sm_path,
939 					 const char *committish)
940 {
941 	struct child_process cp_rev_parse = CHILD_PROCESS_INIT;
942 	struct strbuf result = STRBUF_INIT;
943 
944 	cp_rev_parse.git_cmd = 1;
945 	cp_rev_parse.dir = sm_path;
946 	prepare_submodule_repo_env(&cp_rev_parse.env_array);
947 	strvec_pushl(&cp_rev_parse.args, "rev-parse", "-q", "--short", NULL);
948 	strvec_pushf(&cp_rev_parse.args, "%s^0", committish);
949 	strvec_push(&cp_rev_parse.args, "--");
950 
951 	if (capture_command(&cp_rev_parse, &result, 0))
952 		return NULL;
953 
954 	strbuf_trim_trailing_newline(&result);
955 	return strbuf_detach(&result, NULL);
956 }
957 
print_submodule_summary(struct summary_cb * info,char * errmsg,int total_commits,const char * displaypath,const char * src_abbrev,const char * dst_abbrev,struct module_cb * p)958 static void print_submodule_summary(struct summary_cb *info, char *errmsg,
959 				    int total_commits, const char *displaypath,
960 				    const char *src_abbrev, const char *dst_abbrev,
961 				    struct module_cb *p)
962 {
963 	if (p->status == 'T') {
964 		if (S_ISGITLINK(p->mod_dst))
965 			printf(_("* %s %s(blob)->%s(submodule)"),
966 				 displaypath, src_abbrev, dst_abbrev);
967 		else
968 			printf(_("* %s %s(submodule)->%s(blob)"),
969 				 displaypath, src_abbrev, dst_abbrev);
970 	} else {
971 		printf("* %s %s...%s",
972 			displaypath, src_abbrev, dst_abbrev);
973 	}
974 
975 	if (total_commits < 0)
976 		printf(":\n");
977 	else
978 		printf(" (%d):\n", total_commits);
979 
980 	if (errmsg) {
981 		printf(_("%s"), errmsg);
982 	} else if (total_commits > 0) {
983 		struct child_process cp_log = CHILD_PROCESS_INIT;
984 
985 		cp_log.git_cmd = 1;
986 		cp_log.dir = p->sm_path;
987 		prepare_submodule_repo_env(&cp_log.env_array);
988 		strvec_pushl(&cp_log.args, "log", NULL);
989 
990 		if (S_ISGITLINK(p->mod_src) && S_ISGITLINK(p->mod_dst)) {
991 			if (info->summary_limit > 0)
992 				strvec_pushf(&cp_log.args, "-%d",
993 					     info->summary_limit);
994 
995 			strvec_pushl(&cp_log.args, "--pretty=  %m %s",
996 				     "--first-parent", NULL);
997 			strvec_pushf(&cp_log.args, "%s...%s",
998 				     src_abbrev, dst_abbrev);
999 		} else if (S_ISGITLINK(p->mod_dst)) {
1000 			strvec_pushl(&cp_log.args, "--pretty=  > %s",
1001 				     "-1", dst_abbrev, NULL);
1002 		} else {
1003 			strvec_pushl(&cp_log.args, "--pretty=  < %s",
1004 				     "-1", src_abbrev, NULL);
1005 		}
1006 		run_command(&cp_log);
1007 	}
1008 	printf("\n");
1009 }
1010 
generate_submodule_summary(struct summary_cb * info,struct module_cb * p)1011 static void generate_submodule_summary(struct summary_cb *info,
1012 				       struct module_cb *p)
1013 {
1014 	char *displaypath, *src_abbrev = NULL, *dst_abbrev;
1015 	int missing_src = 0, missing_dst = 0;
1016 	char *errmsg = NULL;
1017 	int total_commits = -1;
1018 
1019 	if (!info->cached && oideq(&p->oid_dst, null_oid())) {
1020 		if (S_ISGITLINK(p->mod_dst)) {
1021 			struct ref_store *refs = get_submodule_ref_store(p->sm_path);
1022 			if (refs)
1023 				refs_head_ref(refs, handle_submodule_head_ref, &p->oid_dst);
1024 		} else if (S_ISLNK(p->mod_dst) || S_ISREG(p->mod_dst)) {
1025 			struct stat st;
1026 			int fd = open(p->sm_path, O_RDONLY);
1027 
1028 			if (fd < 0 || fstat(fd, &st) < 0 ||
1029 			    index_fd(&the_index, &p->oid_dst, fd, &st, OBJ_BLOB,
1030 				     p->sm_path, 0))
1031 				error(_("couldn't hash object from '%s'"), p->sm_path);
1032 		} else {
1033 			/* for a submodule removal (mode:0000000), don't warn */
1034 			if (p->mod_dst)
1035 				warning(_("unexpected mode %o\n"), p->mod_dst);
1036 		}
1037 	}
1038 
1039 	if (S_ISGITLINK(p->mod_src)) {
1040 		if (p->status != 'D')
1041 			src_abbrev = verify_submodule_committish(p->sm_path,
1042 								 oid_to_hex(&p->oid_src));
1043 		if (!src_abbrev) {
1044 			missing_src = 1;
1045 			/*
1046 			 * As `rev-parse` failed, we fallback to getting
1047 			 * the abbreviated hash using oid_src. We do
1048 			 * this as we might still need the abbreviated
1049 			 * hash in cases like a submodule type change, etc.
1050 			 */
1051 			src_abbrev = xstrndup(oid_to_hex(&p->oid_src), 7);
1052 		}
1053 	} else {
1054 		/*
1055 		 * The source does not point to a submodule.
1056 		 * So, we fallback to getting the abbreviation using
1057 		 * oid_src as we might still need the abbreviated
1058 		 * hash in cases like submodule add, etc.
1059 		 */
1060 		src_abbrev = xstrndup(oid_to_hex(&p->oid_src), 7);
1061 	}
1062 
1063 	if (S_ISGITLINK(p->mod_dst)) {
1064 		dst_abbrev = verify_submodule_committish(p->sm_path,
1065 							 oid_to_hex(&p->oid_dst));
1066 		if (!dst_abbrev) {
1067 			missing_dst = 1;
1068 			/*
1069 			 * As `rev-parse` failed, we fallback to getting
1070 			 * the abbreviated hash using oid_dst. We do
1071 			 * this as we might still need the abbreviated
1072 			 * hash in cases like a submodule type change, etc.
1073 			 */
1074 			dst_abbrev = xstrndup(oid_to_hex(&p->oid_dst), 7);
1075 		}
1076 	} else {
1077 		/*
1078 		 * The destination does not point to a submodule.
1079 		 * So, we fallback to getting the abbreviation using
1080 		 * oid_dst as we might still need the abbreviated
1081 		 * hash in cases like a submodule removal, etc.
1082 		 */
1083 		dst_abbrev = xstrndup(oid_to_hex(&p->oid_dst), 7);
1084 	}
1085 
1086 	displaypath = get_submodule_displaypath(p->sm_path, info->prefix);
1087 
1088 	if (!missing_src && !missing_dst) {
1089 		struct child_process cp_rev_list = CHILD_PROCESS_INIT;
1090 		struct strbuf sb_rev_list = STRBUF_INIT;
1091 
1092 		strvec_pushl(&cp_rev_list.args, "rev-list",
1093 			     "--first-parent", "--count", NULL);
1094 		if (S_ISGITLINK(p->mod_src) && S_ISGITLINK(p->mod_dst))
1095 			strvec_pushf(&cp_rev_list.args, "%s...%s",
1096 				     src_abbrev, dst_abbrev);
1097 		else
1098 			strvec_push(&cp_rev_list.args, S_ISGITLINK(p->mod_src) ?
1099 				    src_abbrev : dst_abbrev);
1100 		strvec_push(&cp_rev_list.args, "--");
1101 
1102 		cp_rev_list.git_cmd = 1;
1103 		cp_rev_list.dir = p->sm_path;
1104 		prepare_submodule_repo_env(&cp_rev_list.env_array);
1105 
1106 		if (!capture_command(&cp_rev_list, &sb_rev_list, 0))
1107 			total_commits = atoi(sb_rev_list.buf);
1108 
1109 		strbuf_release(&sb_rev_list);
1110 	} else {
1111 		/*
1112 		 * Don't give error msg for modification whose dst is not
1113 		 * submodule, i.e., deleted or changed to blob
1114 		 */
1115 		if (S_ISGITLINK(p->mod_dst)) {
1116 			struct strbuf errmsg_str = STRBUF_INIT;
1117 			if (missing_src && missing_dst) {
1118 				strbuf_addf(&errmsg_str, "  Warn: %s doesn't contain commits %s and %s\n",
1119 					    displaypath, oid_to_hex(&p->oid_src),
1120 					    oid_to_hex(&p->oid_dst));
1121 			} else {
1122 				strbuf_addf(&errmsg_str, "  Warn: %s doesn't contain commit %s\n",
1123 					    displaypath, missing_src ?
1124 					    oid_to_hex(&p->oid_src) :
1125 					    oid_to_hex(&p->oid_dst));
1126 			}
1127 			errmsg = strbuf_detach(&errmsg_str, NULL);
1128 		}
1129 	}
1130 
1131 	print_submodule_summary(info, errmsg, total_commits,
1132 				displaypath, src_abbrev,
1133 				dst_abbrev, p);
1134 
1135 	free(displaypath);
1136 	free(src_abbrev);
1137 	free(dst_abbrev);
1138 }
1139 
prepare_submodule_summary(struct summary_cb * info,struct module_cb_list * list)1140 static void prepare_submodule_summary(struct summary_cb *info,
1141 				      struct module_cb_list *list)
1142 {
1143 	int i;
1144 	for (i = 0; i < list->nr; i++) {
1145 		const struct submodule *sub;
1146 		struct module_cb *p = list->entries[i];
1147 		struct strbuf sm_gitdir = STRBUF_INIT;
1148 
1149 		if (p->status == 'D' || p->status == 'T') {
1150 			generate_submodule_summary(info, p);
1151 			continue;
1152 		}
1153 
1154 		if (info->for_status && p->status != 'A' &&
1155 		    (sub = submodule_from_path(the_repository,
1156 					       null_oid(), p->sm_path))) {
1157 			char *config_key = NULL;
1158 			const char *value;
1159 			int ignore_all = 0;
1160 
1161 			config_key = xstrfmt("submodule.%s.ignore",
1162 					     sub->name);
1163 			if (!git_config_get_string_tmp(config_key, &value))
1164 				ignore_all = !strcmp(value, "all");
1165 			else if (sub->ignore)
1166 				ignore_all = !strcmp(sub->ignore, "all");
1167 
1168 			free(config_key);
1169 			if (ignore_all)
1170 				continue;
1171 		}
1172 
1173 		/* Also show added or modified modules which are checked out */
1174 		strbuf_addstr(&sm_gitdir, p->sm_path);
1175 		if (is_nonbare_repository_dir(&sm_gitdir))
1176 			generate_submodule_summary(info, p);
1177 		strbuf_release(&sm_gitdir);
1178 	}
1179 }
1180 
submodule_summary_callback(struct diff_queue_struct * q,struct diff_options * options,void * data)1181 static void submodule_summary_callback(struct diff_queue_struct *q,
1182 				       struct diff_options *options,
1183 				       void *data)
1184 {
1185 	int i;
1186 	struct module_cb_list *list = data;
1187 	for (i = 0; i < q->nr; i++) {
1188 		struct diff_filepair *p = q->queue[i];
1189 		struct module_cb *temp;
1190 
1191 		if (!S_ISGITLINK(p->one->mode) && !S_ISGITLINK(p->two->mode))
1192 			continue;
1193 		temp = (struct module_cb*)malloc(sizeof(struct module_cb));
1194 		temp->mod_src = p->one->mode;
1195 		temp->mod_dst = p->two->mode;
1196 		temp->oid_src = p->one->oid;
1197 		temp->oid_dst = p->two->oid;
1198 		temp->status = p->status;
1199 		temp->sm_path = xstrdup(p->one->path);
1200 
1201 		ALLOC_GROW(list->entries, list->nr + 1, list->alloc);
1202 		list->entries[list->nr++] = temp;
1203 	}
1204 }
1205 
get_diff_cmd(enum diff_cmd diff_cmd)1206 static const char *get_diff_cmd(enum diff_cmd diff_cmd)
1207 {
1208 	switch (diff_cmd) {
1209 	case DIFF_INDEX: return "diff-index";
1210 	case DIFF_FILES: return "diff-files";
1211 	default: BUG("bad diff_cmd value %d", diff_cmd);
1212 	}
1213 }
1214 
compute_summary_module_list(struct object_id * head_oid,struct summary_cb * info,enum diff_cmd diff_cmd)1215 static int compute_summary_module_list(struct object_id *head_oid,
1216 				       struct summary_cb *info,
1217 				       enum diff_cmd diff_cmd)
1218 {
1219 	struct strvec diff_args = STRVEC_INIT;
1220 	struct rev_info rev;
1221 	struct module_cb_list list = MODULE_CB_LIST_INIT;
1222 
1223 	strvec_push(&diff_args, get_diff_cmd(diff_cmd));
1224 	if (info->cached)
1225 		strvec_push(&diff_args, "--cached");
1226 	strvec_pushl(&diff_args, "--ignore-submodules=dirty", "--raw", NULL);
1227 	if (head_oid)
1228 		strvec_push(&diff_args, oid_to_hex(head_oid));
1229 	strvec_push(&diff_args, "--");
1230 	if (info->argc)
1231 		strvec_pushv(&diff_args, info->argv);
1232 
1233 	git_config(git_diff_basic_config, NULL);
1234 	init_revisions(&rev, info->prefix);
1235 	rev.abbrev = 0;
1236 	precompose_argv_prefix(diff_args.nr, diff_args.v, NULL);
1237 	setup_revisions(diff_args.nr, diff_args.v, &rev, NULL);
1238 	rev.diffopt.output_format = DIFF_FORMAT_NO_OUTPUT | DIFF_FORMAT_CALLBACK;
1239 	rev.diffopt.format_callback = submodule_summary_callback;
1240 	rev.diffopt.format_callback_data = &list;
1241 
1242 	if (!info->cached) {
1243 		if (diff_cmd == DIFF_INDEX)
1244 			setup_work_tree();
1245 		if (read_cache_preload(&rev.diffopt.pathspec) < 0) {
1246 			perror("read_cache_preload");
1247 			return -1;
1248 		}
1249 	} else if (read_cache() < 0) {
1250 		perror("read_cache");
1251 		return -1;
1252 	}
1253 
1254 	if (diff_cmd == DIFF_INDEX)
1255 		run_diff_index(&rev, info->cached);
1256 	else
1257 		run_diff_files(&rev, 0);
1258 	prepare_submodule_summary(info, &list);
1259 	strvec_clear(&diff_args);
1260 	return 0;
1261 }
1262 
module_summary(int argc,const char ** argv,const char * prefix)1263 static int module_summary(int argc, const char **argv, const char *prefix)
1264 {
1265 	struct summary_cb info = SUMMARY_CB_INIT;
1266 	int cached = 0;
1267 	int for_status = 0;
1268 	int files = 0;
1269 	int summary_limit = -1;
1270 	enum diff_cmd diff_cmd = DIFF_INDEX;
1271 	struct object_id head_oid;
1272 	int ret;
1273 
1274 	struct option module_summary_options[] = {
1275 		OPT_BOOL(0, "cached", &cached,
1276 			 N_("use the commit stored in the index instead of the submodule HEAD")),
1277 		OPT_BOOL(0, "files", &files,
1278 			 N_("compare the commit in the index with that in the submodule HEAD")),
1279 		OPT_BOOL(0, "for-status", &for_status,
1280 			 N_("skip submodules with 'ignore_config' value set to 'all'")),
1281 		OPT_INTEGER('n', "summary-limit", &summary_limit,
1282 			     N_("limit the summary size")),
1283 		OPT_END()
1284 	};
1285 
1286 	const char *const git_submodule_helper_usage[] = {
1287 		N_("git submodule--helper summary [<options>] [<commit>] [--] [<path>]"),
1288 		NULL
1289 	};
1290 
1291 	argc = parse_options(argc, argv, prefix, module_summary_options,
1292 			     git_submodule_helper_usage, 0);
1293 
1294 	if (!summary_limit)
1295 		return 0;
1296 
1297 	if (!get_oid(argc ? argv[0] : "HEAD", &head_oid)) {
1298 		if (argc) {
1299 			argv++;
1300 			argc--;
1301 		}
1302 	} else if (!argc || !strcmp(argv[0], "HEAD")) {
1303 		/* before the first commit: compare with an empty tree */
1304 		oidcpy(&head_oid, the_hash_algo->empty_tree);
1305 		if (argc) {
1306 			argv++;
1307 			argc--;
1308 		}
1309 	} else {
1310 		if (get_oid("HEAD", &head_oid))
1311 			die(_("could not fetch a revision for HEAD"));
1312 	}
1313 
1314 	if (files) {
1315 		if (cached)
1316 			die(_("--cached and --files are mutually exclusive"));
1317 		diff_cmd = DIFF_FILES;
1318 	}
1319 
1320 	info.argc = argc;
1321 	info.argv = argv;
1322 	info.prefix = prefix;
1323 	info.cached = !!cached;
1324 	info.files = !!files;
1325 	info.for_status = !!for_status;
1326 	info.summary_limit = summary_limit;
1327 
1328 	ret = compute_summary_module_list((diff_cmd == DIFF_INDEX) ? &head_oid : NULL,
1329 					  &info, diff_cmd);
1330 	return ret;
1331 }
1332 
1333 struct sync_cb {
1334 	const char *prefix;
1335 	unsigned int flags;
1336 };
1337 #define SYNC_CB_INIT { 0 }
1338 
sync_submodule(const char * path,const char * prefix,unsigned int flags)1339 static void sync_submodule(const char *path, const char *prefix,
1340 			   unsigned int flags)
1341 {
1342 	const struct submodule *sub;
1343 	char *remote_key = NULL;
1344 	char *sub_origin_url, *super_config_url, *displaypath;
1345 	struct strbuf sb = STRBUF_INIT;
1346 	struct child_process cp = CHILD_PROCESS_INIT;
1347 	char *sub_config_path = NULL;
1348 
1349 	if (!is_submodule_active(the_repository, path))
1350 		return;
1351 
1352 	sub = submodule_from_path(the_repository, null_oid(), path);
1353 
1354 	if (sub && sub->url) {
1355 		if (starts_with_dot_dot_slash(sub->url) ||
1356 		    starts_with_dot_slash(sub->url)) {
1357 			char *up_path = get_up_path(path);
1358 			sub_origin_url = resolve_relative_url(sub->url, up_path, 1);
1359 			super_config_url = resolve_relative_url(sub->url, NULL, 1);
1360 			free(up_path);
1361 		} else {
1362 			sub_origin_url = xstrdup(sub->url);
1363 			super_config_url = xstrdup(sub->url);
1364 		}
1365 	} else {
1366 		sub_origin_url = xstrdup("");
1367 		super_config_url = xstrdup("");
1368 	}
1369 
1370 	displaypath = get_submodule_displaypath(path, prefix);
1371 
1372 	if (!(flags & OPT_QUIET))
1373 		printf(_("Synchronizing submodule url for '%s'\n"),
1374 			 displaypath);
1375 
1376 	strbuf_reset(&sb);
1377 	strbuf_addf(&sb, "submodule.%s.url", sub->name);
1378 	if (git_config_set_gently(sb.buf, super_config_url))
1379 		die(_("failed to register url for submodule path '%s'"),
1380 		      displaypath);
1381 
1382 	if (!is_submodule_populated_gently(path, NULL))
1383 		goto cleanup;
1384 
1385 	prepare_submodule_repo_env(&cp.env_array);
1386 	cp.git_cmd = 1;
1387 	cp.dir = path;
1388 	strvec_pushl(&cp.args, "submodule--helper",
1389 		     "print-default-remote", NULL);
1390 
1391 	strbuf_reset(&sb);
1392 	if (capture_command(&cp, &sb, 0))
1393 		die(_("failed to get the default remote for submodule '%s'"),
1394 		      path);
1395 
1396 	strbuf_strip_suffix(&sb, "\n");
1397 	remote_key = xstrfmt("remote.%s.url", sb.buf);
1398 
1399 	strbuf_reset(&sb);
1400 	submodule_to_gitdir(&sb, path);
1401 	strbuf_addstr(&sb, "/config");
1402 
1403 	if (git_config_set_in_file_gently(sb.buf, remote_key, sub_origin_url))
1404 		die(_("failed to update remote for submodule '%s'"),
1405 		      path);
1406 
1407 	if (flags & OPT_RECURSIVE) {
1408 		struct child_process cpr = CHILD_PROCESS_INIT;
1409 
1410 		cpr.git_cmd = 1;
1411 		cpr.dir = path;
1412 		prepare_submodule_repo_env(&cpr.env_array);
1413 
1414 		strvec_push(&cpr.args, "--super-prefix");
1415 		strvec_pushf(&cpr.args, "%s/", displaypath);
1416 		strvec_pushl(&cpr.args, "submodule--helper", "sync",
1417 			     "--recursive", NULL);
1418 
1419 		if (flags & OPT_QUIET)
1420 			strvec_push(&cpr.args, "--quiet");
1421 
1422 		if (run_command(&cpr))
1423 			die(_("failed to recurse into submodule '%s'"),
1424 			      path);
1425 	}
1426 
1427 cleanup:
1428 	free(super_config_url);
1429 	free(sub_origin_url);
1430 	strbuf_release(&sb);
1431 	free(remote_key);
1432 	free(displaypath);
1433 	free(sub_config_path);
1434 }
1435 
sync_submodule_cb(const struct cache_entry * list_item,void * cb_data)1436 static void sync_submodule_cb(const struct cache_entry *list_item, void *cb_data)
1437 {
1438 	struct sync_cb *info = cb_data;
1439 	sync_submodule(list_item->name, info->prefix, info->flags);
1440 }
1441 
module_sync(int argc,const char ** argv,const char * prefix)1442 static int module_sync(int argc, const char **argv, const char *prefix)
1443 {
1444 	struct sync_cb info = SYNC_CB_INIT;
1445 	struct pathspec pathspec;
1446 	struct module_list list = MODULE_LIST_INIT;
1447 	int quiet = 0;
1448 	int recursive = 0;
1449 
1450 	struct option module_sync_options[] = {
1451 		OPT__QUIET(&quiet, N_("suppress output of synchronizing submodule url")),
1452 		OPT_BOOL(0, "recursive", &recursive,
1453 			N_("recurse into nested submodules")),
1454 		OPT_END()
1455 	};
1456 
1457 	const char *const git_submodule_helper_usage[] = {
1458 		N_("git submodule--helper sync [--quiet] [--recursive] [<path>]"),
1459 		NULL
1460 	};
1461 
1462 	argc = parse_options(argc, argv, prefix, module_sync_options,
1463 			     git_submodule_helper_usage, 0);
1464 
1465 	if (module_list_compute(argc, argv, prefix, &pathspec, &list) < 0)
1466 		return 1;
1467 
1468 	info.prefix = prefix;
1469 	if (quiet)
1470 		info.flags |= OPT_QUIET;
1471 	if (recursive)
1472 		info.flags |= OPT_RECURSIVE;
1473 
1474 	for_each_listed_submodule(&list, sync_submodule_cb, &info);
1475 
1476 	return 0;
1477 }
1478 
1479 struct deinit_cb {
1480 	const char *prefix;
1481 	unsigned int flags;
1482 };
1483 #define DEINIT_CB_INIT { 0 }
1484 
deinit_submodule(const char * path,const char * prefix,unsigned int flags)1485 static void deinit_submodule(const char *path, const char *prefix,
1486 			     unsigned int flags)
1487 {
1488 	const struct submodule *sub;
1489 	char *displaypath = NULL;
1490 	struct child_process cp_config = CHILD_PROCESS_INIT;
1491 	struct strbuf sb_config = STRBUF_INIT;
1492 	char *sub_git_dir = xstrfmt("%s/.git", path);
1493 
1494 	sub = submodule_from_path(the_repository, null_oid(), path);
1495 
1496 	if (!sub || !sub->name)
1497 		goto cleanup;
1498 
1499 	displaypath = get_submodule_displaypath(path, prefix);
1500 
1501 	/* remove the submodule work tree (unless the user already did it) */
1502 	if (is_directory(path)) {
1503 		struct strbuf sb_rm = STRBUF_INIT;
1504 		const char *format;
1505 
1506 		/*
1507 		 * protect submodules containing a .git directory
1508 		 * NEEDSWORK: instead of dying, automatically call
1509 		 * absorbgitdirs and (possibly) warn.
1510 		 */
1511 		if (is_directory(sub_git_dir))
1512 			die(_("Submodule work tree '%s' contains a .git "
1513 			      "directory (use 'rm -rf' if you really want "
1514 			      "to remove it including all of its history)"),
1515 			    displaypath);
1516 
1517 		if (!(flags & OPT_FORCE)) {
1518 			struct child_process cp_rm = CHILD_PROCESS_INIT;
1519 			cp_rm.git_cmd = 1;
1520 			strvec_pushl(&cp_rm.args, "rm", "-qn",
1521 				     path, NULL);
1522 
1523 			if (run_command(&cp_rm))
1524 				die(_("Submodule work tree '%s' contains local "
1525 				      "modifications; use '-f' to discard them"),
1526 				      displaypath);
1527 		}
1528 
1529 		strbuf_addstr(&sb_rm, path);
1530 
1531 		if (!remove_dir_recursively(&sb_rm, 0))
1532 			format = _("Cleared directory '%s'\n");
1533 		else
1534 			format = _("Could not remove submodule work tree '%s'\n");
1535 
1536 		if (!(flags & OPT_QUIET))
1537 			printf(format, displaypath);
1538 
1539 		submodule_unset_core_worktree(sub);
1540 
1541 		strbuf_release(&sb_rm);
1542 	}
1543 
1544 	if (mkdir(path, 0777))
1545 		printf(_("could not create empty submodule directory %s"),
1546 		      displaypath);
1547 
1548 	cp_config.git_cmd = 1;
1549 	strvec_pushl(&cp_config.args, "config", "--get-regexp", NULL);
1550 	strvec_pushf(&cp_config.args, "submodule.%s\\.", sub->name);
1551 
1552 	/* remove the .git/config entries (unless the user already did it) */
1553 	if (!capture_command(&cp_config, &sb_config, 0) && sb_config.len) {
1554 		char *sub_key = xstrfmt("submodule.%s", sub->name);
1555 		/*
1556 		 * remove the whole section so we have a clean state when
1557 		 * the user later decides to init this submodule again
1558 		 */
1559 		git_config_rename_section_in_file(NULL, sub_key, NULL);
1560 		if (!(flags & OPT_QUIET))
1561 			printf(_("Submodule '%s' (%s) unregistered for path '%s'\n"),
1562 				 sub->name, sub->url, displaypath);
1563 		free(sub_key);
1564 	}
1565 
1566 cleanup:
1567 	free(displaypath);
1568 	free(sub_git_dir);
1569 	strbuf_release(&sb_config);
1570 }
1571 
deinit_submodule_cb(const struct cache_entry * list_item,void * cb_data)1572 static void deinit_submodule_cb(const struct cache_entry *list_item,
1573 				void *cb_data)
1574 {
1575 	struct deinit_cb *info = cb_data;
1576 	deinit_submodule(list_item->name, info->prefix, info->flags);
1577 }
1578 
module_deinit(int argc,const char ** argv,const char * prefix)1579 static int module_deinit(int argc, const char **argv, const char *prefix)
1580 {
1581 	struct deinit_cb info = DEINIT_CB_INIT;
1582 	struct pathspec pathspec;
1583 	struct module_list list = MODULE_LIST_INIT;
1584 	int quiet = 0;
1585 	int force = 0;
1586 	int all = 0;
1587 
1588 	struct option module_deinit_options[] = {
1589 		OPT__QUIET(&quiet, N_("suppress submodule status output")),
1590 		OPT__FORCE(&force, N_("remove submodule working trees even if they contain local changes"), 0),
1591 		OPT_BOOL(0, "all", &all, N_("unregister all submodules")),
1592 		OPT_END()
1593 	};
1594 
1595 	const char *const git_submodule_helper_usage[] = {
1596 		N_("git submodule deinit [--quiet] [-f | --force] [--all | [--] [<path>...]]"),
1597 		NULL
1598 	};
1599 
1600 	argc = parse_options(argc, argv, prefix, module_deinit_options,
1601 			     git_submodule_helper_usage, 0);
1602 
1603 	if (all && argc) {
1604 		error("pathspec and --all are incompatible");
1605 		usage_with_options(git_submodule_helper_usage,
1606 				   module_deinit_options);
1607 	}
1608 
1609 	if (!argc && !all)
1610 		die(_("Use '--all' if you really want to deinitialize all submodules"));
1611 
1612 	if (module_list_compute(argc, argv, prefix, &pathspec, &list) < 0)
1613 		return 1;
1614 
1615 	info.prefix = prefix;
1616 	if (quiet)
1617 		info.flags |= OPT_QUIET;
1618 	if (force)
1619 		info.flags |= OPT_FORCE;
1620 
1621 	for_each_listed_submodule(&list, deinit_submodule_cb, &info);
1622 
1623 	return 0;
1624 }
1625 
1626 struct module_clone_data {
1627 	const char *prefix;
1628 	const char *path;
1629 	const char *name;
1630 	const char *url;
1631 	const char *depth;
1632 	struct string_list reference;
1633 	unsigned int quiet: 1;
1634 	unsigned int progress: 1;
1635 	unsigned int dissociate: 1;
1636 	unsigned int require_init: 1;
1637 	int single_branch;
1638 };
1639 #define MODULE_CLONE_DATA_INIT { .reference = STRING_LIST_INIT_NODUP, .single_branch = -1 }
1640 
1641 struct submodule_alternate_setup {
1642 	const char *submodule_name;
1643 	enum SUBMODULE_ALTERNATE_ERROR_MODE {
1644 		SUBMODULE_ALTERNATE_ERROR_DIE,
1645 		SUBMODULE_ALTERNATE_ERROR_INFO,
1646 		SUBMODULE_ALTERNATE_ERROR_IGNORE
1647 	} error_mode;
1648 	struct string_list *reference;
1649 };
1650 #define SUBMODULE_ALTERNATE_SETUP_INIT { \
1651 	.error_mode = SUBMODULE_ALTERNATE_ERROR_IGNORE, \
1652 }
1653 
1654 static const char alternate_error_advice[] = N_(
1655 "An alternate computed from a superproject's alternate is invalid.\n"
1656 "To allow Git to clone without an alternate in such a case, set\n"
1657 "submodule.alternateErrorStrategy to 'info' or, equivalently, clone with\n"
1658 "'--reference-if-able' instead of '--reference'."
1659 );
1660 
add_possible_reference_from_superproject(struct object_directory * odb,void * sas_cb)1661 static int add_possible_reference_from_superproject(
1662 		struct object_directory *odb, void *sas_cb)
1663 {
1664 	struct submodule_alternate_setup *sas = sas_cb;
1665 	size_t len;
1666 
1667 	/*
1668 	 * If the alternate object store is another repository, try the
1669 	 * standard layout with .git/(modules/<name>)+/objects
1670 	 */
1671 	if (strip_suffix(odb->path, "/objects", &len)) {
1672 		struct repository alternate;
1673 		char *sm_alternate;
1674 		struct strbuf sb = STRBUF_INIT;
1675 		struct strbuf err = STRBUF_INIT;
1676 		strbuf_add(&sb, odb->path, len);
1677 
1678 		repo_init(&alternate, sb.buf, NULL);
1679 
1680 		/*
1681 		 * We need to end the new path with '/' to mark it as a dir,
1682 		 * otherwise a submodule name containing '/' will be broken
1683 		 * as the last part of a missing submodule reference would
1684 		 * be taken as a file name.
1685 		 */
1686 		strbuf_reset(&sb);
1687 		submodule_name_to_gitdir(&sb, &alternate, sas->submodule_name);
1688 		strbuf_addch(&sb, '/');
1689 		repo_clear(&alternate);
1690 
1691 		sm_alternate = compute_alternate_path(sb.buf, &err);
1692 		if (sm_alternate) {
1693 			string_list_append(sas->reference, xstrdup(sb.buf));
1694 			free(sm_alternate);
1695 		} else {
1696 			switch (sas->error_mode) {
1697 			case SUBMODULE_ALTERNATE_ERROR_DIE:
1698 				if (advice_enabled(ADVICE_SUBMODULE_ALTERNATE_ERROR_STRATEGY_DIE))
1699 					advise(_(alternate_error_advice));
1700 				die(_("submodule '%s' cannot add alternate: %s"),
1701 				    sas->submodule_name, err.buf);
1702 			case SUBMODULE_ALTERNATE_ERROR_INFO:
1703 				fprintf_ln(stderr, _("submodule '%s' cannot add alternate: %s"),
1704 					sas->submodule_name, err.buf);
1705 			case SUBMODULE_ALTERNATE_ERROR_IGNORE:
1706 				; /* nothing */
1707 			}
1708 		}
1709 		strbuf_release(&sb);
1710 	}
1711 
1712 	return 0;
1713 }
1714 
prepare_possible_alternates(const char * sm_name,struct string_list * reference)1715 static void prepare_possible_alternates(const char *sm_name,
1716 		struct string_list *reference)
1717 {
1718 	char *sm_alternate = NULL, *error_strategy = NULL;
1719 	struct submodule_alternate_setup sas = SUBMODULE_ALTERNATE_SETUP_INIT;
1720 
1721 	git_config_get_string("submodule.alternateLocation", &sm_alternate);
1722 	if (!sm_alternate)
1723 		return;
1724 
1725 	git_config_get_string("submodule.alternateErrorStrategy", &error_strategy);
1726 
1727 	if (!error_strategy)
1728 		error_strategy = xstrdup("die");
1729 
1730 	sas.submodule_name = sm_name;
1731 	sas.reference = reference;
1732 	if (!strcmp(error_strategy, "die"))
1733 		sas.error_mode = SUBMODULE_ALTERNATE_ERROR_DIE;
1734 	else if (!strcmp(error_strategy, "info"))
1735 		sas.error_mode = SUBMODULE_ALTERNATE_ERROR_INFO;
1736 	else if (!strcmp(error_strategy, "ignore"))
1737 		sas.error_mode = SUBMODULE_ALTERNATE_ERROR_IGNORE;
1738 	else
1739 		die(_("Value '%s' for submodule.alternateErrorStrategy is not recognized"), error_strategy);
1740 
1741 	if (!strcmp(sm_alternate, "superproject"))
1742 		foreach_alt_odb(add_possible_reference_from_superproject, &sas);
1743 	else if (!strcmp(sm_alternate, "no"))
1744 		; /* do nothing */
1745 	else
1746 		die(_("Value '%s' for submodule.alternateLocation is not recognized"), sm_alternate);
1747 
1748 	free(sm_alternate);
1749 	free(error_strategy);
1750 }
1751 
clone_submodule(struct module_clone_data * clone_data)1752 static int clone_submodule(struct module_clone_data *clone_data)
1753 {
1754 	char *p, *sm_gitdir;
1755 	char *sm_alternate = NULL, *error_strategy = NULL;
1756 	struct strbuf sb = STRBUF_INIT;
1757 	struct child_process cp = CHILD_PROCESS_INIT;
1758 
1759 	submodule_name_to_gitdir(&sb, the_repository, clone_data->name);
1760 	sm_gitdir = absolute_pathdup(sb.buf);
1761 	strbuf_reset(&sb);
1762 
1763 	if (!is_absolute_path(clone_data->path)) {
1764 		strbuf_addf(&sb, "%s/%s", get_git_work_tree(), clone_data->path);
1765 		clone_data->path = strbuf_detach(&sb, NULL);
1766 	} else {
1767 		clone_data->path = xstrdup(clone_data->path);
1768 	}
1769 
1770 	if (validate_submodule_git_dir(sm_gitdir, clone_data->name) < 0)
1771 		die(_("refusing to create/use '%s' in another submodule's "
1772 		      "git dir"), sm_gitdir);
1773 
1774 	if (!file_exists(sm_gitdir)) {
1775 		if (safe_create_leading_directories_const(sm_gitdir) < 0)
1776 			die(_("could not create directory '%s'"), sm_gitdir);
1777 
1778 		prepare_possible_alternates(clone_data->name, &clone_data->reference);
1779 
1780 		strvec_push(&cp.args, "clone");
1781 		strvec_push(&cp.args, "--no-checkout");
1782 		if (clone_data->quiet)
1783 			strvec_push(&cp.args, "--quiet");
1784 		if (clone_data->progress)
1785 			strvec_push(&cp.args, "--progress");
1786 		if (clone_data->depth && *(clone_data->depth))
1787 			strvec_pushl(&cp.args, "--depth", clone_data->depth, NULL);
1788 		if (clone_data->reference.nr) {
1789 			struct string_list_item *item;
1790 			for_each_string_list_item(item, &clone_data->reference)
1791 				strvec_pushl(&cp.args, "--reference",
1792 					     item->string, NULL);
1793 		}
1794 		if (clone_data->dissociate)
1795 			strvec_push(&cp.args, "--dissociate");
1796 		if (sm_gitdir && *sm_gitdir)
1797 			strvec_pushl(&cp.args, "--separate-git-dir", sm_gitdir, NULL);
1798 		if (clone_data->single_branch >= 0)
1799 			strvec_push(&cp.args, clone_data->single_branch ?
1800 				    "--single-branch" :
1801 				    "--no-single-branch");
1802 
1803 		strvec_push(&cp.args, "--");
1804 		strvec_push(&cp.args, clone_data->url);
1805 		strvec_push(&cp.args, clone_data->path);
1806 
1807 		cp.git_cmd = 1;
1808 		prepare_submodule_repo_env(&cp.env_array);
1809 		cp.no_stdin = 1;
1810 
1811 		if(run_command(&cp))
1812 			die(_("clone of '%s' into submodule path '%s' failed"),
1813 			    clone_data->url, clone_data->path);
1814 	} else {
1815 		if (clone_data->require_init && !access(clone_data->path, X_OK) &&
1816 		    !is_empty_dir(clone_data->path))
1817 			die(_("directory not empty: '%s'"), clone_data->path);
1818 		if (safe_create_leading_directories_const(clone_data->path) < 0)
1819 			die(_("could not create directory '%s'"), clone_data->path);
1820 		strbuf_addf(&sb, "%s/index", sm_gitdir);
1821 		unlink_or_warn(sb.buf);
1822 		strbuf_reset(&sb);
1823 	}
1824 
1825 	connect_work_tree_and_git_dir(clone_data->path, sm_gitdir, 0);
1826 
1827 	p = git_pathdup_submodule(clone_data->path, "config");
1828 	if (!p)
1829 		die(_("could not get submodule directory for '%s'"), clone_data->path);
1830 
1831 	/* setup alternateLocation and alternateErrorStrategy in the cloned submodule if needed */
1832 	git_config_get_string("submodule.alternateLocation", &sm_alternate);
1833 	if (sm_alternate)
1834 		git_config_set_in_file(p, "submodule.alternateLocation",
1835 				       sm_alternate);
1836 	git_config_get_string("submodule.alternateErrorStrategy", &error_strategy);
1837 	if (error_strategy)
1838 		git_config_set_in_file(p, "submodule.alternateErrorStrategy",
1839 				       error_strategy);
1840 
1841 	free(sm_alternate);
1842 	free(error_strategy);
1843 
1844 	strbuf_release(&sb);
1845 	free(sm_gitdir);
1846 	free(p);
1847 	return 0;
1848 }
1849 
module_clone(int argc,const char ** argv,const char * prefix)1850 static int module_clone(int argc, const char **argv, const char *prefix)
1851 {
1852 	int dissociate = 0, quiet = 0, progress = 0, require_init = 0;
1853 	struct module_clone_data clone_data = MODULE_CLONE_DATA_INIT;
1854 
1855 	struct option module_clone_options[] = {
1856 		OPT_STRING(0, "prefix", &clone_data.prefix,
1857 			   N_("path"),
1858 			   N_("alternative anchor for relative paths")),
1859 		OPT_STRING(0, "path", &clone_data.path,
1860 			   N_("path"),
1861 			   N_("where the new submodule will be cloned to")),
1862 		OPT_STRING(0, "name", &clone_data.name,
1863 			   N_("string"),
1864 			   N_("name of the new submodule")),
1865 		OPT_STRING(0, "url", &clone_data.url,
1866 			   N_("string"),
1867 			   N_("url where to clone the submodule from")),
1868 		OPT_STRING_LIST(0, "reference", &clone_data.reference,
1869 			   N_("repo"),
1870 			   N_("reference repository")),
1871 		OPT_BOOL(0, "dissociate", &dissociate,
1872 			   N_("use --reference only while cloning")),
1873 		OPT_STRING(0, "depth", &clone_data.depth,
1874 			   N_("string"),
1875 			   N_("depth for shallow clones")),
1876 		OPT__QUIET(&quiet, "Suppress output for cloning a submodule"),
1877 		OPT_BOOL(0, "progress", &progress,
1878 			   N_("force cloning progress")),
1879 		OPT_BOOL(0, "require-init", &require_init,
1880 			   N_("disallow cloning into non-empty directory")),
1881 		OPT_BOOL(0, "single-branch", &clone_data.single_branch,
1882 			 N_("clone only one branch, HEAD or --branch")),
1883 		OPT_END()
1884 	};
1885 
1886 	const char *const git_submodule_helper_usage[] = {
1887 		N_("git submodule--helper clone [--prefix=<path>] [--quiet] "
1888 		   "[--reference <repository>] [--name <name>] [--depth <depth>] "
1889 		   "[--single-branch] "
1890 		   "--url <url> --path <path>"),
1891 		NULL
1892 	};
1893 
1894 	argc = parse_options(argc, argv, prefix, module_clone_options,
1895 			     git_submodule_helper_usage, 0);
1896 
1897 	clone_data.dissociate = !!dissociate;
1898 	clone_data.quiet = !!quiet;
1899 	clone_data.progress = !!progress;
1900 	clone_data.require_init = !!require_init;
1901 
1902 	if (argc || !clone_data.url || !clone_data.path || !*(clone_data.path))
1903 		usage_with_options(git_submodule_helper_usage,
1904 				   module_clone_options);
1905 
1906 	clone_submodule(&clone_data);
1907 	return 0;
1908 }
1909 
determine_submodule_update_strategy(struct repository * r,int just_cloned,const char * path,const char * update,struct submodule_update_strategy * out)1910 static void determine_submodule_update_strategy(struct repository *r,
1911 						int just_cloned,
1912 						const char *path,
1913 						const char *update,
1914 						struct submodule_update_strategy *out)
1915 {
1916 	const struct submodule *sub = submodule_from_path(r, null_oid(), path);
1917 	char *key;
1918 	const char *val;
1919 
1920 	key = xstrfmt("submodule.%s.update", sub->name);
1921 
1922 	if (update) {
1923 		if (parse_submodule_update_strategy(update, out) < 0)
1924 			die(_("Invalid update mode '%s' for submodule path '%s'"),
1925 				update, path);
1926 	} else if (!repo_config_get_string_tmp(r, key, &val)) {
1927 		if (parse_submodule_update_strategy(val, out) < 0)
1928 			die(_("Invalid update mode '%s' configured for submodule path '%s'"),
1929 				val, path);
1930 	} else if (sub->update_strategy.type != SM_UPDATE_UNSPECIFIED) {
1931 		if (sub->update_strategy.type == SM_UPDATE_COMMAND)
1932 			BUG("how did we read update = !command from .gitmodules?");
1933 		out->type = sub->update_strategy.type;
1934 		out->command = sub->update_strategy.command;
1935 	} else
1936 		out->type = SM_UPDATE_CHECKOUT;
1937 
1938 	if (just_cloned &&
1939 	    (out->type == SM_UPDATE_MERGE ||
1940 	     out->type == SM_UPDATE_REBASE ||
1941 	     out->type == SM_UPDATE_NONE))
1942 		out->type = SM_UPDATE_CHECKOUT;
1943 
1944 	free(key);
1945 }
1946 
module_update_module_mode(int argc,const char ** argv,const char * prefix)1947 static int module_update_module_mode(int argc, const char **argv, const char *prefix)
1948 {
1949 	const char *path, *update = NULL;
1950 	int just_cloned;
1951 	struct submodule_update_strategy update_strategy = { .type = SM_UPDATE_CHECKOUT };
1952 
1953 	if (argc < 3 || argc > 4)
1954 		die("submodule--helper update-module-clone expects <just-cloned> <path> [<update>]");
1955 
1956 	just_cloned = git_config_int("just_cloned", argv[1]);
1957 	path = argv[2];
1958 
1959 	if (argc == 4)
1960 		update = argv[3];
1961 
1962 	determine_submodule_update_strategy(the_repository,
1963 					    just_cloned, path, update,
1964 					    &update_strategy);
1965 	fputs(submodule_strategy_to_string(&update_strategy), stdout);
1966 
1967 	return 0;
1968 }
1969 
1970 struct update_clone_data {
1971 	const struct submodule *sub;
1972 	struct object_id oid;
1973 	unsigned just_cloned;
1974 };
1975 
1976 struct submodule_update_clone {
1977 	/* index into 'list', the list of submodules to look into for cloning */
1978 	int current;
1979 	struct module_list list;
1980 	unsigned warn_if_uninitialized : 1;
1981 
1982 	/* update parameter passed via commandline */
1983 	struct submodule_update_strategy update;
1984 
1985 	/* configuration parameters which are passed on to the children */
1986 	int progress;
1987 	int quiet;
1988 	int recommend_shallow;
1989 	struct string_list references;
1990 	int dissociate;
1991 	unsigned require_init;
1992 	const char *depth;
1993 	const char *recursive_prefix;
1994 	const char *prefix;
1995 	int single_branch;
1996 
1997 	/* to be consumed by git-submodule.sh */
1998 	struct update_clone_data *update_clone;
1999 	int update_clone_nr; int update_clone_alloc;
2000 
2001 	/* If we want to stop as fast as possible and return an error */
2002 	unsigned quickstop : 1;
2003 
2004 	/* failed clones to be retried again */
2005 	const struct cache_entry **failed_clones;
2006 	int failed_clones_nr, failed_clones_alloc;
2007 
2008 	int max_jobs;
2009 };
2010 #define SUBMODULE_UPDATE_CLONE_INIT { \
2011 	.list = MODULE_LIST_INIT, \
2012 	.update = SUBMODULE_UPDATE_STRATEGY_INIT, \
2013 	.recommend_shallow = -1, \
2014 	.references = STRING_LIST_INIT_DUP, \
2015 	.single_branch = -1, \
2016 	.max_jobs = 1, \
2017 }
2018 
2019 struct update_data {
2020 	const char *recursive_prefix;
2021 	const char *sm_path;
2022 	const char *displaypath;
2023 	struct object_id oid;
2024 	struct object_id suboid;
2025 	struct submodule_update_strategy update_strategy;
2026 	int depth;
2027 	unsigned int force: 1;
2028 	unsigned int quiet: 1;
2029 	unsigned int nofetch: 1;
2030 	unsigned int just_cloned: 1;
2031 };
2032 #define UPDATE_DATA_INIT { .update_strategy = SUBMODULE_UPDATE_STRATEGY_INIT }
2033 
next_submodule_warn_missing(struct submodule_update_clone * suc,struct strbuf * out,const char * displaypath)2034 static void next_submodule_warn_missing(struct submodule_update_clone *suc,
2035 		struct strbuf *out, const char *displaypath)
2036 {
2037 	/*
2038 	 * Only mention uninitialized submodules when their
2039 	 * paths have been specified.
2040 	 */
2041 	if (suc->warn_if_uninitialized) {
2042 		strbuf_addf(out,
2043 			_("Submodule path '%s' not initialized"),
2044 			displaypath);
2045 		strbuf_addch(out, '\n');
2046 		strbuf_addstr(out,
2047 			_("Maybe you want to use 'update --init'?"));
2048 		strbuf_addch(out, '\n');
2049 	}
2050 }
2051 
2052 /**
2053  * Determine whether 'ce' needs to be cloned. If so, prepare the 'child' to
2054  * run the clone. Returns 1 if 'ce' needs to be cloned, 0 otherwise.
2055  */
prepare_to_clone_next_submodule(const struct cache_entry * ce,struct child_process * child,struct submodule_update_clone * suc,struct strbuf * out)2056 static int prepare_to_clone_next_submodule(const struct cache_entry *ce,
2057 					   struct child_process *child,
2058 					   struct submodule_update_clone *suc,
2059 					   struct strbuf *out)
2060 {
2061 	const struct submodule *sub = NULL;
2062 	const char *url = NULL;
2063 	const char *update_string;
2064 	enum submodule_update_type update_type;
2065 	char *key;
2066 	struct strbuf displaypath_sb = STRBUF_INIT;
2067 	struct strbuf sb = STRBUF_INIT;
2068 	const char *displaypath = NULL;
2069 	int needs_cloning = 0;
2070 	int need_free_url = 0;
2071 
2072 	if (ce_stage(ce)) {
2073 		if (suc->recursive_prefix)
2074 			strbuf_addf(&sb, "%s/%s", suc->recursive_prefix, ce->name);
2075 		else
2076 			strbuf_addstr(&sb, ce->name);
2077 		strbuf_addf(out, _("Skipping unmerged submodule %s"), sb.buf);
2078 		strbuf_addch(out, '\n');
2079 		goto cleanup;
2080 	}
2081 
2082 	sub = submodule_from_path(the_repository, null_oid(), ce->name);
2083 
2084 	if (suc->recursive_prefix)
2085 		displaypath = relative_path(suc->recursive_prefix,
2086 					    ce->name, &displaypath_sb);
2087 	else
2088 		displaypath = ce->name;
2089 
2090 	if (!sub) {
2091 		next_submodule_warn_missing(suc, out, displaypath);
2092 		goto cleanup;
2093 	}
2094 
2095 	key = xstrfmt("submodule.%s.update", sub->name);
2096 	if (!repo_config_get_string_tmp(the_repository, key, &update_string)) {
2097 		update_type = parse_submodule_update_type(update_string);
2098 	} else {
2099 		update_type = sub->update_strategy.type;
2100 	}
2101 	free(key);
2102 
2103 	if (suc->update.type == SM_UPDATE_NONE
2104 	    || (suc->update.type == SM_UPDATE_UNSPECIFIED
2105 		&& update_type == SM_UPDATE_NONE)) {
2106 		strbuf_addf(out, _("Skipping submodule '%s'"), displaypath);
2107 		strbuf_addch(out, '\n');
2108 		goto cleanup;
2109 	}
2110 
2111 	/* Check if the submodule has been initialized. */
2112 	if (!is_submodule_active(the_repository, ce->name)) {
2113 		next_submodule_warn_missing(suc, out, displaypath);
2114 		goto cleanup;
2115 	}
2116 
2117 	strbuf_reset(&sb);
2118 	strbuf_addf(&sb, "submodule.%s.url", sub->name);
2119 	if (repo_config_get_string_tmp(the_repository, sb.buf, &url)) {
2120 		if (starts_with_dot_slash(sub->url) ||
2121 		    starts_with_dot_dot_slash(sub->url)) {
2122 			url = resolve_relative_url(sub->url, NULL, 0);
2123 			need_free_url = 1;
2124 		} else
2125 			url = sub->url;
2126 	}
2127 
2128 	strbuf_reset(&sb);
2129 	strbuf_addf(&sb, "%s/.git", ce->name);
2130 	needs_cloning = !file_exists(sb.buf);
2131 
2132 	ALLOC_GROW(suc->update_clone, suc->update_clone_nr + 1,
2133 		   suc->update_clone_alloc);
2134 	oidcpy(&suc->update_clone[suc->update_clone_nr].oid, &ce->oid);
2135 	suc->update_clone[suc->update_clone_nr].just_cloned = needs_cloning;
2136 	suc->update_clone[suc->update_clone_nr].sub = sub;
2137 	suc->update_clone_nr++;
2138 
2139 	if (!needs_cloning)
2140 		goto cleanup;
2141 
2142 	child->git_cmd = 1;
2143 	child->no_stdin = 1;
2144 	child->stdout_to_stderr = 1;
2145 	child->err = -1;
2146 	strvec_push(&child->args, "submodule--helper");
2147 	strvec_push(&child->args, "clone");
2148 	if (suc->progress)
2149 		strvec_push(&child->args, "--progress");
2150 	if (suc->quiet)
2151 		strvec_push(&child->args, "--quiet");
2152 	if (suc->prefix)
2153 		strvec_pushl(&child->args, "--prefix", suc->prefix, NULL);
2154 	if (suc->recommend_shallow && sub->recommend_shallow == 1)
2155 		strvec_push(&child->args, "--depth=1");
2156 	if (suc->require_init)
2157 		strvec_push(&child->args, "--require-init");
2158 	strvec_pushl(&child->args, "--path", sub->path, NULL);
2159 	strvec_pushl(&child->args, "--name", sub->name, NULL);
2160 	strvec_pushl(&child->args, "--url", url, NULL);
2161 	if (suc->references.nr) {
2162 		struct string_list_item *item;
2163 		for_each_string_list_item(item, &suc->references)
2164 			strvec_pushl(&child->args, "--reference", item->string, NULL);
2165 	}
2166 	if (suc->dissociate)
2167 		strvec_push(&child->args, "--dissociate");
2168 	if (suc->depth)
2169 		strvec_push(&child->args, suc->depth);
2170 	if (suc->single_branch >= 0)
2171 		strvec_push(&child->args, suc->single_branch ?
2172 					      "--single-branch" :
2173 					      "--no-single-branch");
2174 
2175 cleanup:
2176 	strbuf_release(&displaypath_sb);
2177 	strbuf_release(&sb);
2178 	if (need_free_url)
2179 		free((void*)url);
2180 
2181 	return needs_cloning;
2182 }
2183 
update_clone_get_next_task(struct child_process * child,struct strbuf * err,void * suc_cb,void ** idx_task_cb)2184 static int update_clone_get_next_task(struct child_process *child,
2185 				      struct strbuf *err,
2186 				      void *suc_cb,
2187 				      void **idx_task_cb)
2188 {
2189 	struct submodule_update_clone *suc = suc_cb;
2190 	const struct cache_entry *ce;
2191 	int index;
2192 
2193 	for (; suc->current < suc->list.nr; suc->current++) {
2194 		ce = suc->list.entries[suc->current];
2195 		if (prepare_to_clone_next_submodule(ce, child, suc, err)) {
2196 			int *p = xmalloc(sizeof(*p));
2197 			*p = suc->current;
2198 			*idx_task_cb = p;
2199 			suc->current++;
2200 			return 1;
2201 		}
2202 	}
2203 
2204 	/*
2205 	 * The loop above tried cloning each submodule once, now try the
2206 	 * stragglers again, which we can imagine as an extension of the
2207 	 * entry list.
2208 	 */
2209 	index = suc->current - suc->list.nr;
2210 	if (index < suc->failed_clones_nr) {
2211 		int *p;
2212 		ce = suc->failed_clones[index];
2213 		if (!prepare_to_clone_next_submodule(ce, child, suc, err)) {
2214 			suc->current ++;
2215 			strbuf_addstr(err, "BUG: submodule considered for "
2216 					   "cloning, doesn't need cloning "
2217 					   "any more?\n");
2218 			return 0;
2219 		}
2220 		p = xmalloc(sizeof(*p));
2221 		*p = suc->current;
2222 		*idx_task_cb = p;
2223 		suc->current ++;
2224 		return 1;
2225 	}
2226 
2227 	return 0;
2228 }
2229 
update_clone_start_failure(struct strbuf * err,void * suc_cb,void * idx_task_cb)2230 static int update_clone_start_failure(struct strbuf *err,
2231 				      void *suc_cb,
2232 				      void *idx_task_cb)
2233 {
2234 	struct submodule_update_clone *suc = suc_cb;
2235 	suc->quickstop = 1;
2236 	return 1;
2237 }
2238 
update_clone_task_finished(int result,struct strbuf * err,void * suc_cb,void * idx_task_cb)2239 static int update_clone_task_finished(int result,
2240 				      struct strbuf *err,
2241 				      void *suc_cb,
2242 				      void *idx_task_cb)
2243 {
2244 	const struct cache_entry *ce;
2245 	struct submodule_update_clone *suc = suc_cb;
2246 
2247 	int *idxP = idx_task_cb;
2248 	int idx = *idxP;
2249 	free(idxP);
2250 
2251 	if (!result)
2252 		return 0;
2253 
2254 	if (idx < suc->list.nr) {
2255 		ce  = suc->list.entries[idx];
2256 		strbuf_addf(err, _("Failed to clone '%s'. Retry scheduled"),
2257 			    ce->name);
2258 		strbuf_addch(err, '\n');
2259 		ALLOC_GROW(suc->failed_clones,
2260 			   suc->failed_clones_nr + 1,
2261 			   suc->failed_clones_alloc);
2262 		suc->failed_clones[suc->failed_clones_nr++] = ce;
2263 		return 0;
2264 	} else {
2265 		idx -= suc->list.nr;
2266 		ce  = suc->failed_clones[idx];
2267 		strbuf_addf(err, _("Failed to clone '%s' a second time, aborting"),
2268 			    ce->name);
2269 		strbuf_addch(err, '\n');
2270 		suc->quickstop = 1;
2271 		return 1;
2272 	}
2273 
2274 	return 0;
2275 }
2276 
git_update_clone_config(const char * var,const char * value,void * cb)2277 static int git_update_clone_config(const char *var, const char *value,
2278 				   void *cb)
2279 {
2280 	int *max_jobs = cb;
2281 	if (!strcmp(var, "submodule.fetchjobs"))
2282 		*max_jobs = parse_submodule_fetchjobs(var, value);
2283 	return 0;
2284 }
2285 
is_tip_reachable(const char * path,struct object_id * oid)2286 static int is_tip_reachable(const char *path, struct object_id *oid)
2287 {
2288 	struct child_process cp = CHILD_PROCESS_INIT;
2289 	struct strbuf rev = STRBUF_INIT;
2290 	char *hex = oid_to_hex(oid);
2291 
2292 	cp.git_cmd = 1;
2293 	cp.dir = xstrdup(path);
2294 	cp.no_stderr = 1;
2295 	strvec_pushl(&cp.args, "rev-list", "-n", "1", hex, "--not", "--all", NULL);
2296 
2297 	prepare_submodule_repo_env(&cp.env_array);
2298 
2299 	if (capture_command(&cp, &rev, GIT_MAX_HEXSZ + 1) || rev.len)
2300 		return 0;
2301 
2302 	return 1;
2303 }
2304 
fetch_in_submodule(const char * module_path,int depth,int quiet,struct object_id * oid)2305 static int fetch_in_submodule(const char *module_path, int depth, int quiet, struct object_id *oid)
2306 {
2307 	struct child_process cp = CHILD_PROCESS_INIT;
2308 
2309 	prepare_submodule_repo_env(&cp.env_array);
2310 	cp.git_cmd = 1;
2311 	cp.dir = xstrdup(module_path);
2312 
2313 	strvec_push(&cp.args, "fetch");
2314 	if (quiet)
2315 		strvec_push(&cp.args, "--quiet");
2316 	if (depth)
2317 		strvec_pushf(&cp.args, "--depth=%d", depth);
2318 	if (oid) {
2319 		char *hex = oid_to_hex(oid);
2320 		char *remote = get_default_remote();
2321 		strvec_pushl(&cp.args, remote, hex, NULL);
2322 	}
2323 
2324 	return run_command(&cp);
2325 }
2326 
run_update_command(struct update_data * ud,int subforce)2327 static int run_update_command(struct update_data *ud, int subforce)
2328 {
2329 	struct strvec args = STRVEC_INIT;
2330 	struct strvec child_env = STRVEC_INIT;
2331 	char *oid = oid_to_hex(&ud->oid);
2332 	int must_die_on_failure = 0;
2333 	int git_cmd;
2334 
2335 	switch (ud->update_strategy.type) {
2336 	case SM_UPDATE_CHECKOUT:
2337 		git_cmd = 1;
2338 		strvec_pushl(&args, "checkout", "-q", NULL);
2339 		if (subforce)
2340 			strvec_push(&args, "-f");
2341 		break;
2342 	case SM_UPDATE_REBASE:
2343 		git_cmd = 1;
2344 		strvec_push(&args, "rebase");
2345 		if (ud->quiet)
2346 			strvec_push(&args, "--quiet");
2347 		must_die_on_failure = 1;
2348 		break;
2349 	case SM_UPDATE_MERGE:
2350 		git_cmd = 1;
2351 		strvec_push(&args, "merge");
2352 		if (ud->quiet)
2353 			strvec_push(&args, "--quiet");
2354 		must_die_on_failure = 1;
2355 		break;
2356 	case SM_UPDATE_COMMAND:
2357 		git_cmd = 0;
2358 		strvec_push(&args, ud->update_strategy.command);
2359 		must_die_on_failure = 1;
2360 		break;
2361 	default:
2362 		BUG("unexpected update strategy type: %s",
2363 		    submodule_strategy_to_string(&ud->update_strategy));
2364 	}
2365 	strvec_push(&args, oid);
2366 
2367 	prepare_submodule_repo_env(&child_env);
2368 	if (run_command_v_opt_cd_env(args.v, git_cmd ? RUN_GIT_CMD : RUN_USING_SHELL,
2369 				     ud->sm_path, child_env.v)) {
2370 		switch (ud->update_strategy.type) {
2371 		case SM_UPDATE_CHECKOUT:
2372 			printf(_("Unable to checkout '%s' in submodule path '%s'"),
2373 			       oid, ud->displaypath);
2374 			break;
2375 		case SM_UPDATE_REBASE:
2376 			printf(_("Unable to rebase '%s' in submodule path '%s'"),
2377 			       oid, ud->displaypath);
2378 			break;
2379 		case SM_UPDATE_MERGE:
2380 			printf(_("Unable to merge '%s' in submodule path '%s'"),
2381 			       oid, ud->displaypath);
2382 			break;
2383 		case SM_UPDATE_COMMAND:
2384 			printf(_("Execution of '%s %s' failed in submodule path '%s'"),
2385 			       ud->update_strategy.command, oid, ud->displaypath);
2386 			break;
2387 		default:
2388 			BUG("unexpected update strategy type: %s",
2389 			    submodule_strategy_to_string(&ud->update_strategy));
2390 		}
2391 		/*
2392 		 * NEEDSWORK: We are currently printing to stdout with error
2393 		 * return so that the shell caller handles the error output
2394 		 * properly. Once we start handling the error messages within
2395 		 * C, we should use die() instead.
2396 		 */
2397 		if (must_die_on_failure)
2398 			return 2;
2399 		/*
2400 		 * This signifies to the caller in shell that the command
2401 		 * failed without dying
2402 		 */
2403 		return 1;
2404 	}
2405 
2406 	switch (ud->update_strategy.type) {
2407 	case SM_UPDATE_CHECKOUT:
2408 		printf(_("Submodule path '%s': checked out '%s'\n"),
2409 		       ud->displaypath, oid);
2410 		break;
2411 	case SM_UPDATE_REBASE:
2412 		printf(_("Submodule path '%s': rebased into '%s'\n"),
2413 		       ud->displaypath, oid);
2414 		break;
2415 	case SM_UPDATE_MERGE:
2416 		printf(_("Submodule path '%s': merged in '%s'\n"),
2417 		       ud->displaypath, oid);
2418 		break;
2419 	case SM_UPDATE_COMMAND:
2420 		printf(_("Submodule path '%s': '%s %s'\n"),
2421 		       ud->displaypath, ud->update_strategy.command, oid);
2422 		break;
2423 	default:
2424 		BUG("unexpected update strategy type: %s",
2425 		    submodule_strategy_to_string(&ud->update_strategy));
2426 	}
2427 
2428 	return 0;
2429 }
2430 
do_run_update_procedure(struct update_data * ud)2431 static int do_run_update_procedure(struct update_data *ud)
2432 {
2433 	int subforce = is_null_oid(&ud->suboid) || ud->force;
2434 
2435 	if (!ud->nofetch) {
2436 		/*
2437 		 * Run fetch only if `oid` isn't present or it
2438 		 * is not reachable from a ref.
2439 		 */
2440 		if (!is_tip_reachable(ud->sm_path, &ud->oid) &&
2441 		    fetch_in_submodule(ud->sm_path, ud->depth, ud->quiet, NULL) &&
2442 		    !ud->quiet)
2443 			fprintf_ln(stderr,
2444 				   _("Unable to fetch in submodule path '%s'; "
2445 				     "trying to directly fetch %s:"),
2446 				   ud->displaypath, oid_to_hex(&ud->oid));
2447 		/*
2448 		 * Now we tried the usual fetch, but `oid` may
2449 		 * not be reachable from any of the refs.
2450 		 */
2451 		if (!is_tip_reachable(ud->sm_path, &ud->oid) &&
2452 		    fetch_in_submodule(ud->sm_path, ud->depth, ud->quiet, &ud->oid))
2453 			die(_("Fetched in submodule path '%s', but it did not "
2454 			      "contain %s. Direct fetching of that commit failed."),
2455 			    ud->displaypath, oid_to_hex(&ud->oid));
2456 	}
2457 
2458 	return run_update_command(ud, subforce);
2459 }
2460 
update_submodule(struct update_clone_data * ucd)2461 static void update_submodule(struct update_clone_data *ucd)
2462 {
2463 	fprintf(stdout, "dummy %s %d\t%s\n",
2464 		oid_to_hex(&ucd->oid),
2465 		ucd->just_cloned,
2466 		ucd->sub->path);
2467 }
2468 
update_submodules(struct submodule_update_clone * suc)2469 static int update_submodules(struct submodule_update_clone *suc)
2470 {
2471 	int i;
2472 
2473 	run_processes_parallel_tr2(suc->max_jobs, update_clone_get_next_task,
2474 				   update_clone_start_failure,
2475 				   update_clone_task_finished, suc, "submodule",
2476 				   "parallel/update");
2477 
2478 	/*
2479 	 * We saved the output and put it out all at once now.
2480 	 * That means:
2481 	 * - the listener does not have to interleave their (checkout)
2482 	 *   work with our fetching.  The writes involved in a
2483 	 *   checkout involve more straightforward sequential I/O.
2484 	 * - the listener can avoid doing any work if fetching failed.
2485 	 */
2486 	if (suc->quickstop)
2487 		return 1;
2488 
2489 	for (i = 0; i < suc->update_clone_nr; i++)
2490 		update_submodule(&suc->update_clone[i]);
2491 
2492 	return 0;
2493 }
2494 
update_clone(int argc,const char ** argv,const char * prefix)2495 static int update_clone(int argc, const char **argv, const char *prefix)
2496 {
2497 	const char *update = NULL;
2498 	struct pathspec pathspec;
2499 	struct submodule_update_clone suc = SUBMODULE_UPDATE_CLONE_INIT;
2500 
2501 	struct option module_update_clone_options[] = {
2502 		OPT_STRING(0, "prefix", &prefix,
2503 			   N_("path"),
2504 			   N_("path into the working tree")),
2505 		OPT_STRING(0, "recursive-prefix", &suc.recursive_prefix,
2506 			   N_("path"),
2507 			   N_("path into the working tree, across nested "
2508 			      "submodule boundaries")),
2509 		OPT_STRING(0, "update", &update,
2510 			   N_("string"),
2511 			   N_("rebase, merge, checkout or none")),
2512 		OPT_STRING_LIST(0, "reference", &suc.references, N_("repo"),
2513 			   N_("reference repository")),
2514 		OPT_BOOL(0, "dissociate", &suc.dissociate,
2515 			   N_("use --reference only while cloning")),
2516 		OPT_STRING(0, "depth", &suc.depth, "<depth>",
2517 			   N_("create a shallow clone truncated to the "
2518 			      "specified number of revisions")),
2519 		OPT_INTEGER('j', "jobs", &suc.max_jobs,
2520 			    N_("parallel jobs")),
2521 		OPT_BOOL(0, "recommend-shallow", &suc.recommend_shallow,
2522 			    N_("whether the initial clone should follow the shallow recommendation")),
2523 		OPT__QUIET(&suc.quiet, N_("don't print cloning progress")),
2524 		OPT_BOOL(0, "progress", &suc.progress,
2525 			    N_("force cloning progress")),
2526 		OPT_BOOL(0, "require-init", &suc.require_init,
2527 			   N_("disallow cloning into non-empty directory")),
2528 		OPT_BOOL(0, "single-branch", &suc.single_branch,
2529 			 N_("clone only one branch, HEAD or --branch")),
2530 		OPT_END()
2531 	};
2532 
2533 	const char *const git_submodule_helper_usage[] = {
2534 		N_("git submodule--helper update-clone [--prefix=<path>] [<path>...]"),
2535 		NULL
2536 	};
2537 	suc.prefix = prefix;
2538 
2539 	update_clone_config_from_gitmodules(&suc.max_jobs);
2540 	git_config(git_update_clone_config, &suc.max_jobs);
2541 
2542 	argc = parse_options(argc, argv, prefix, module_update_clone_options,
2543 			     git_submodule_helper_usage, 0);
2544 
2545 	if (update)
2546 		if (parse_submodule_update_strategy(update, &suc.update) < 0)
2547 			die(_("bad value for update parameter"));
2548 
2549 	if (module_list_compute(argc, argv, prefix, &pathspec, &suc.list) < 0)
2550 		return 1;
2551 
2552 	if (pathspec.nr)
2553 		suc.warn_if_uninitialized = 1;
2554 
2555 	return update_submodules(&suc);
2556 }
2557 
run_update_procedure(int argc,const char ** argv,const char * prefix)2558 static int run_update_procedure(int argc, const char **argv, const char *prefix)
2559 {
2560 	int force = 0, quiet = 0, nofetch = 0, just_cloned = 0;
2561 	char *prefixed_path, *update = NULL;
2562 	struct update_data update_data = UPDATE_DATA_INIT;
2563 
2564 	struct option options[] = {
2565 		OPT__QUIET(&quiet, N_("suppress output for update by rebase or merge")),
2566 		OPT__FORCE(&force, N_("force checkout updates"), 0),
2567 		OPT_BOOL('N', "no-fetch", &nofetch,
2568 			 N_("don't fetch new objects from the remote site")),
2569 		OPT_BOOL(0, "just-cloned", &just_cloned,
2570 			 N_("overrides update mode in case the repository is a fresh clone")),
2571 		OPT_INTEGER(0, "depth", &update_data.depth, N_("depth for shallow fetch")),
2572 		OPT_STRING(0, "prefix", &prefix,
2573 			   N_("path"),
2574 			   N_("path into the working tree")),
2575 		OPT_STRING(0, "update", &update,
2576 			   N_("string"),
2577 			   N_("rebase, merge, checkout or none")),
2578 		OPT_STRING(0, "recursive-prefix", &update_data.recursive_prefix, N_("path"),
2579 			   N_("path into the working tree, across nested "
2580 			      "submodule boundaries")),
2581 		OPT_CALLBACK_F(0, "oid", &update_data.oid, N_("sha1"),
2582 			       N_("SHA1 expected by superproject"), PARSE_OPT_NONEG,
2583 			       parse_opt_object_id),
2584 		OPT_CALLBACK_F(0, "suboid", &update_data.suboid, N_("subsha1"),
2585 			       N_("SHA1 of submodule's HEAD"), PARSE_OPT_NONEG,
2586 			       parse_opt_object_id),
2587 		OPT_END()
2588 	};
2589 
2590 	const char *const usage[] = {
2591 		N_("git submodule--helper run-update-procedure [<options>] <path>"),
2592 		NULL
2593 	};
2594 
2595 	argc = parse_options(argc, argv, prefix, options, usage, 0);
2596 
2597 	if (argc != 1)
2598 		usage_with_options(usage, options);
2599 
2600 	update_data.force = !!force;
2601 	update_data.quiet = !!quiet;
2602 	update_data.nofetch = !!nofetch;
2603 	update_data.just_cloned = !!just_cloned;
2604 	update_data.sm_path = argv[0];
2605 
2606 	if (update_data.recursive_prefix)
2607 		prefixed_path = xstrfmt("%s%s", update_data.recursive_prefix, update_data.sm_path);
2608 	else
2609 		prefixed_path = xstrdup(update_data.sm_path);
2610 
2611 	update_data.displaypath = get_submodule_displaypath(prefixed_path, prefix);
2612 
2613 	determine_submodule_update_strategy(the_repository, update_data.just_cloned,
2614 					    update_data.sm_path, update,
2615 					    &update_data.update_strategy);
2616 
2617 	free(prefixed_path);
2618 
2619 	if (!oideq(&update_data.oid, &update_data.suboid) || update_data.force)
2620 		return do_run_update_procedure(&update_data);
2621 
2622 	return 3;
2623 }
2624 
resolve_relative_path(int argc,const char ** argv,const char * prefix)2625 static int resolve_relative_path(int argc, const char **argv, const char *prefix)
2626 {
2627 	struct strbuf sb = STRBUF_INIT;
2628 	if (argc != 3)
2629 		die("submodule--helper relative-path takes exactly 2 arguments, got %d", argc);
2630 
2631 	printf("%s", relative_path(argv[1], argv[2], &sb));
2632 	strbuf_release(&sb);
2633 	return 0;
2634 }
2635 
remote_submodule_branch(const char * path)2636 static const char *remote_submodule_branch(const char *path)
2637 {
2638 	const struct submodule *sub;
2639 	const char *branch = NULL;
2640 	char *key;
2641 
2642 	sub = submodule_from_path(the_repository, null_oid(), path);
2643 	if (!sub)
2644 		return NULL;
2645 
2646 	key = xstrfmt("submodule.%s.branch", sub->name);
2647 	if (repo_config_get_string_tmp(the_repository, key, &branch))
2648 		branch = sub->branch;
2649 	free(key);
2650 
2651 	if (!branch)
2652 		return "HEAD";
2653 
2654 	if (!strcmp(branch, ".")) {
2655 		const char *refname = resolve_ref_unsafe("HEAD", 0, NULL, NULL);
2656 
2657 		if (!refname)
2658 			die(_("No such ref: %s"), "HEAD");
2659 
2660 		/* detached HEAD */
2661 		if (!strcmp(refname, "HEAD"))
2662 			die(_("Submodule (%s) branch configured to inherit "
2663 			      "branch from superproject, but the superproject "
2664 			      "is not on any branch"), sub->name);
2665 
2666 		if (!skip_prefix(refname, "refs/heads/", &refname))
2667 			die(_("Expecting a full ref name, got %s"), refname);
2668 		return refname;
2669 	}
2670 
2671 	return branch;
2672 }
2673 
resolve_remote_submodule_branch(int argc,const char ** argv,const char * prefix)2674 static int resolve_remote_submodule_branch(int argc, const char **argv,
2675 		const char *prefix)
2676 {
2677 	const char *ret;
2678 	struct strbuf sb = STRBUF_INIT;
2679 	if (argc != 2)
2680 		die("submodule--helper remote-branch takes exactly one arguments, got %d", argc);
2681 
2682 	ret = remote_submodule_branch(argv[1]);
2683 	if (!ret)
2684 		die("submodule %s doesn't exist", argv[1]);
2685 
2686 	printf("%s", ret);
2687 	strbuf_release(&sb);
2688 	return 0;
2689 }
2690 
push_check(int argc,const char ** argv,const char * prefix)2691 static int push_check(int argc, const char **argv, const char *prefix)
2692 {
2693 	struct remote *remote;
2694 	const char *superproject_head;
2695 	char *head;
2696 	int detached_head = 0;
2697 	struct object_id head_oid;
2698 
2699 	if (argc < 3)
2700 		die("submodule--helper push-check requires at least 2 arguments");
2701 
2702 	/*
2703 	 * superproject's resolved head ref.
2704 	 * if HEAD then the superproject is in a detached head state, otherwise
2705 	 * it will be the resolved head ref.
2706 	 */
2707 	superproject_head = argv[1];
2708 	argv++;
2709 	argc--;
2710 	/* Get the submodule's head ref and determine if it is detached */
2711 	head = resolve_refdup("HEAD", 0, &head_oid, NULL);
2712 	if (!head)
2713 		die(_("Failed to resolve HEAD as a valid ref."));
2714 	if (!strcmp(head, "HEAD"))
2715 		detached_head = 1;
2716 
2717 	/*
2718 	 * The remote must be configured.
2719 	 * This is to avoid pushing to the exact same URL as the parent.
2720 	 */
2721 	remote = pushremote_get(argv[1]);
2722 	if (!remote || remote->origin == REMOTE_UNCONFIGURED)
2723 		die("remote '%s' not configured", argv[1]);
2724 
2725 	/* Check the refspec */
2726 	if (argc > 2) {
2727 		int i;
2728 		struct ref *local_refs = get_local_heads();
2729 		struct refspec refspec = REFSPEC_INIT_PUSH;
2730 
2731 		refspec_appendn(&refspec, argv + 2, argc - 2);
2732 
2733 		for (i = 0; i < refspec.nr; i++) {
2734 			const struct refspec_item *rs = &refspec.items[i];
2735 
2736 			if (rs->pattern || rs->matching)
2737 				continue;
2738 
2739 			/* LHS must match a single ref */
2740 			switch (count_refspec_match(rs->src, local_refs, NULL)) {
2741 			case 1:
2742 				break;
2743 			case 0:
2744 				/*
2745 				 * If LHS matches 'HEAD' then we need to ensure
2746 				 * that it matches the same named branch
2747 				 * checked out in the superproject.
2748 				 */
2749 				if (!strcmp(rs->src, "HEAD")) {
2750 					if (!detached_head &&
2751 					    !strcmp(head, superproject_head))
2752 						break;
2753 					die("HEAD does not match the named branch in the superproject");
2754 				}
2755 				/* fallthrough */
2756 			default:
2757 				die("src refspec '%s' must name a ref",
2758 				    rs->src);
2759 			}
2760 		}
2761 		refspec_clear(&refspec);
2762 	}
2763 	free(head);
2764 
2765 	return 0;
2766 }
2767 
ensure_core_worktree(int argc,const char ** argv,const char * prefix)2768 static int ensure_core_worktree(int argc, const char **argv, const char *prefix)
2769 {
2770 	const char *path;
2771 	const char *cw;
2772 	struct repository subrepo;
2773 
2774 	if (argc != 2)
2775 		BUG("submodule--helper ensure-core-worktree <path>");
2776 
2777 	path = argv[1];
2778 
2779 	if (repo_submodule_init(&subrepo, the_repository, path, null_oid()))
2780 		die(_("could not get a repository handle for submodule '%s'"), path);
2781 
2782 	if (!repo_config_get_string_tmp(&subrepo, "core.worktree", &cw)) {
2783 		char *cfg_file, *abs_path;
2784 		const char *rel_path;
2785 		struct strbuf sb = STRBUF_INIT;
2786 
2787 		cfg_file = repo_git_path(&subrepo, "config");
2788 
2789 		abs_path = absolute_pathdup(path);
2790 		rel_path = relative_path(abs_path, subrepo.gitdir, &sb);
2791 
2792 		git_config_set_in_file(cfg_file, "core.worktree", rel_path);
2793 
2794 		free(cfg_file);
2795 		free(abs_path);
2796 		strbuf_release(&sb);
2797 	}
2798 
2799 	return 0;
2800 }
2801 
absorb_git_dirs(int argc,const char ** argv,const char * prefix)2802 static int absorb_git_dirs(int argc, const char **argv, const char *prefix)
2803 {
2804 	int i;
2805 	struct pathspec pathspec;
2806 	struct module_list list = MODULE_LIST_INIT;
2807 	unsigned flags = ABSORB_GITDIR_RECURSE_SUBMODULES;
2808 
2809 	struct option embed_gitdir_options[] = {
2810 		OPT_STRING(0, "prefix", &prefix,
2811 			   N_("path"),
2812 			   N_("path into the working tree")),
2813 		OPT_BIT(0, "--recursive", &flags, N_("recurse into submodules"),
2814 			ABSORB_GITDIR_RECURSE_SUBMODULES),
2815 		OPT_END()
2816 	};
2817 
2818 	const char *const git_submodule_helper_usage[] = {
2819 		N_("git submodule--helper absorb-git-dirs [<options>] [<path>...]"),
2820 		NULL
2821 	};
2822 
2823 	argc = parse_options(argc, argv, prefix, embed_gitdir_options,
2824 			     git_submodule_helper_usage, 0);
2825 
2826 	if (module_list_compute(argc, argv, prefix, &pathspec, &list) < 0)
2827 		return 1;
2828 
2829 	for (i = 0; i < list.nr; i++)
2830 		absorb_git_dir_into_superproject(list.entries[i]->name, flags);
2831 
2832 	return 0;
2833 }
2834 
is_active(int argc,const char ** argv,const char * prefix)2835 static int is_active(int argc, const char **argv, const char *prefix)
2836 {
2837 	if (argc != 2)
2838 		die("submodule--helper is-active takes exactly 1 argument");
2839 
2840 	return !is_submodule_active(the_repository, argv[1]);
2841 }
2842 
2843 /*
2844  * Exit non-zero if any of the submodule names given on the command line is
2845  * invalid. If no names are given, filter stdin to print only valid names
2846  * (which is primarily intended for testing).
2847  */
check_name(int argc,const char ** argv,const char * prefix)2848 static int check_name(int argc, const char **argv, const char *prefix)
2849 {
2850 	if (argc > 1) {
2851 		while (*++argv) {
2852 			if (check_submodule_name(*argv) < 0)
2853 				return 1;
2854 		}
2855 	} else {
2856 		struct strbuf buf = STRBUF_INIT;
2857 		while (strbuf_getline(&buf, stdin) != EOF) {
2858 			if (!check_submodule_name(buf.buf))
2859 				printf("%s\n", buf.buf);
2860 		}
2861 		strbuf_release(&buf);
2862 	}
2863 	return 0;
2864 }
2865 
module_config(int argc,const char ** argv,const char * prefix)2866 static int module_config(int argc, const char **argv, const char *prefix)
2867 {
2868 	enum {
2869 		CHECK_WRITEABLE = 1,
2870 		DO_UNSET = 2
2871 	} command = 0;
2872 
2873 	struct option module_config_options[] = {
2874 		OPT_CMDMODE(0, "check-writeable", &command,
2875 			    N_("check if it is safe to write to the .gitmodules file"),
2876 			    CHECK_WRITEABLE),
2877 		OPT_CMDMODE(0, "unset", &command,
2878 			    N_("unset the config in the .gitmodules file"),
2879 			    DO_UNSET),
2880 		OPT_END()
2881 	};
2882 	const char *const git_submodule_helper_usage[] = {
2883 		N_("git submodule--helper config <name> [<value>]"),
2884 		N_("git submodule--helper config --unset <name>"),
2885 		N_("git submodule--helper config --check-writeable"),
2886 		NULL
2887 	};
2888 
2889 	argc = parse_options(argc, argv, prefix, module_config_options,
2890 			     git_submodule_helper_usage, PARSE_OPT_KEEP_ARGV0);
2891 
2892 	if (argc == 1 && command == CHECK_WRITEABLE)
2893 		return is_writing_gitmodules_ok() ? 0 : -1;
2894 
2895 	/* Equivalent to ACTION_GET in builtin/config.c */
2896 	if (argc == 2 && command != DO_UNSET)
2897 		return print_config_from_gitmodules(the_repository, argv[1]);
2898 
2899 	/* Equivalent to ACTION_SET in builtin/config.c */
2900 	if (argc == 3 || (argc == 2 && command == DO_UNSET)) {
2901 		const char *value = (argc == 3) ? argv[2] : NULL;
2902 
2903 		if (!is_writing_gitmodules_ok())
2904 			die(_("please make sure that the .gitmodules file is in the working tree"));
2905 
2906 		return config_set_in_gitmodules_file_gently(argv[1], value);
2907 	}
2908 
2909 	usage_with_options(git_submodule_helper_usage, module_config_options);
2910 }
2911 
module_set_url(int argc,const char ** argv,const char * prefix)2912 static int module_set_url(int argc, const char **argv, const char *prefix)
2913 {
2914 	int quiet = 0;
2915 	const char *newurl;
2916 	const char *path;
2917 	char *config_name;
2918 
2919 	struct option options[] = {
2920 		OPT__QUIET(&quiet, N_("suppress output for setting url of a submodule")),
2921 		OPT_END()
2922 	};
2923 	const char *const usage[] = {
2924 		N_("git submodule--helper set-url [--quiet] <path> <newurl>"),
2925 		NULL
2926 	};
2927 
2928 	argc = parse_options(argc, argv, prefix, options, usage, 0);
2929 
2930 	if (argc != 2 || !(path = argv[0]) || !(newurl = argv[1]))
2931 		usage_with_options(usage, options);
2932 
2933 	config_name = xstrfmt("submodule.%s.url", path);
2934 
2935 	config_set_in_gitmodules_file_gently(config_name, newurl);
2936 	sync_submodule(path, prefix, quiet ? OPT_QUIET : 0);
2937 
2938 	free(config_name);
2939 
2940 	return 0;
2941 }
2942 
module_set_branch(int argc,const char ** argv,const char * prefix)2943 static int module_set_branch(int argc, const char **argv, const char *prefix)
2944 {
2945 	int opt_default = 0, ret;
2946 	const char *opt_branch = NULL;
2947 	const char *path;
2948 	char *config_name;
2949 
2950 	/*
2951 	 * We accept the `quiet` option for uniformity across subcommands,
2952 	 * though there is nothing to make less verbose in this subcommand.
2953 	 */
2954 	struct option options[] = {
2955 		OPT_NOOP_NOARG('q', "quiet"),
2956 		OPT_BOOL('d', "default", &opt_default,
2957 			N_("set the default tracking branch to master")),
2958 		OPT_STRING('b', "branch", &opt_branch, N_("branch"),
2959 			N_("set the default tracking branch")),
2960 		OPT_END()
2961 	};
2962 	const char *const usage[] = {
2963 		N_("git submodule--helper set-branch [-q|--quiet] (-d|--default) <path>"),
2964 		N_("git submodule--helper set-branch [-q|--quiet] (-b|--branch) <branch> <path>"),
2965 		NULL
2966 	};
2967 
2968 	argc = parse_options(argc, argv, prefix, options, usage, 0);
2969 
2970 	if (!opt_branch && !opt_default)
2971 		die(_("--branch or --default required"));
2972 
2973 	if (opt_branch && opt_default)
2974 		die(_("--branch and --default are mutually exclusive"));
2975 
2976 	if (argc != 1 || !(path = argv[0]))
2977 		usage_with_options(usage, options);
2978 
2979 	config_name = xstrfmt("submodule.%s.branch", path);
2980 	ret = config_set_in_gitmodules_file_gently(config_name, opt_branch);
2981 
2982 	free(config_name);
2983 	return !!ret;
2984 }
2985 
2986 struct add_data {
2987 	const char *prefix;
2988 	const char *branch;
2989 	const char *reference_path;
2990 	char *sm_path;
2991 	const char *sm_name;
2992 	const char *repo;
2993 	const char *realrepo;
2994 	int depth;
2995 	unsigned int force: 1;
2996 	unsigned int quiet: 1;
2997 	unsigned int progress: 1;
2998 	unsigned int dissociate: 1;
2999 };
3000 #define ADD_DATA_INIT { .depth = -1 }
3001 
append_fetch_remotes(struct strbuf * msg,const char * git_dir_path)3002 static void append_fetch_remotes(struct strbuf *msg, const char *git_dir_path)
3003 {
3004 	struct child_process cp_remote = CHILD_PROCESS_INIT;
3005 	struct strbuf sb_remote_out = STRBUF_INIT;
3006 
3007 	cp_remote.git_cmd = 1;
3008 	strvec_pushf(&cp_remote.env_array,
3009 		     "GIT_DIR=%s", git_dir_path);
3010 	strvec_push(&cp_remote.env_array, "GIT_WORK_TREE=.");
3011 	strvec_pushl(&cp_remote.args, "remote", "-v", NULL);
3012 	if (!capture_command(&cp_remote, &sb_remote_out, 0)) {
3013 		char *next_line;
3014 		char *line = sb_remote_out.buf;
3015 		while ((next_line = strchr(line, '\n')) != NULL) {
3016 			size_t len = next_line - line;
3017 			if (strip_suffix_mem(line, &len, " (fetch)"))
3018 				strbuf_addf(msg, "  %.*s\n", (int)len, line);
3019 			line = next_line + 1;
3020 		}
3021 	}
3022 
3023 	strbuf_release(&sb_remote_out);
3024 }
3025 
add_submodule(const struct add_data * add_data)3026 static int add_submodule(const struct add_data *add_data)
3027 {
3028 	char *submod_gitdir_path;
3029 	struct module_clone_data clone_data = MODULE_CLONE_DATA_INIT;
3030 
3031 	/* perhaps the path already exists and is already a git repo, else clone it */
3032 	if (is_directory(add_data->sm_path)) {
3033 		struct strbuf sm_path = STRBUF_INIT;
3034 		strbuf_addstr(&sm_path, add_data->sm_path);
3035 		submod_gitdir_path = xstrfmt("%s/.git", add_data->sm_path);
3036 		if (is_nonbare_repository_dir(&sm_path))
3037 			printf(_("Adding existing repo at '%s' to the index\n"),
3038 			       add_data->sm_path);
3039 		else
3040 			die(_("'%s' already exists and is not a valid git repo"),
3041 			    add_data->sm_path);
3042 		strbuf_release(&sm_path);
3043 		free(submod_gitdir_path);
3044 	} else {
3045 		struct child_process cp = CHILD_PROCESS_INIT;
3046 		submod_gitdir_path = xstrfmt(".git/modules/%s", add_data->sm_name);
3047 
3048 		if (is_directory(submod_gitdir_path)) {
3049 			if (!add_data->force) {
3050 				struct strbuf msg = STRBUF_INIT;
3051 				char *die_msg;
3052 
3053 				strbuf_addf(&msg, _("A git directory for '%s' is found "
3054 						    "locally with remote(s):\n"),
3055 					    add_data->sm_name);
3056 
3057 				append_fetch_remotes(&msg, submod_gitdir_path);
3058 				free(submod_gitdir_path);
3059 
3060 				strbuf_addf(&msg, _("If you want to reuse this local git "
3061 						    "directory instead of cloning again from\n"
3062 						    "  %s\n"
3063 						    "use the '--force' option. If the local git "
3064 						    "directory is not the correct repo\n"
3065 						    "or you are unsure what this means choose "
3066 						    "another name with the '--name' option."),
3067 					    add_data->realrepo);
3068 
3069 				die_msg = strbuf_detach(&msg, NULL);
3070 				die("%s", die_msg);
3071 			} else {
3072 				printf(_("Reactivating local git directory for "
3073 					 "submodule '%s'\n"), add_data->sm_name);
3074 			}
3075 		}
3076 		free(submod_gitdir_path);
3077 
3078 		clone_data.prefix = add_data->prefix;
3079 		clone_data.path = add_data->sm_path;
3080 		clone_data.name = add_data->sm_name;
3081 		clone_data.url = add_data->realrepo;
3082 		clone_data.quiet = add_data->quiet;
3083 		clone_data.progress = add_data->progress;
3084 		if (add_data->reference_path)
3085 			string_list_append(&clone_data.reference,
3086 					   xstrdup(add_data->reference_path));
3087 		clone_data.dissociate = add_data->dissociate;
3088 		if (add_data->depth >= 0)
3089 			clone_data.depth = xstrfmt("%d", add_data->depth);
3090 
3091 		if (clone_submodule(&clone_data))
3092 			return -1;
3093 
3094 		prepare_submodule_repo_env(&cp.env_array);
3095 		cp.git_cmd = 1;
3096 		cp.dir = add_data->sm_path;
3097 		/*
3098 		 * NOTE: we only get here if add_data->force is true, so
3099 		 * passing --force to checkout is reasonable.
3100 		 */
3101 		strvec_pushl(&cp.args, "checkout", "-f", "-q", NULL);
3102 
3103 		if (add_data->branch) {
3104 			strvec_pushl(&cp.args, "-B", add_data->branch, NULL);
3105 			strvec_pushf(&cp.args, "origin/%s", add_data->branch);
3106 		}
3107 
3108 		if (run_command(&cp))
3109 			die(_("unable to checkout submodule '%s'"), add_data->sm_path);
3110 	}
3111 	return 0;
3112 }
3113 
config_submodule_in_gitmodules(const char * name,const char * var,const char * value)3114 static int config_submodule_in_gitmodules(const char *name, const char *var, const char *value)
3115 {
3116 	char *key;
3117 	int ret;
3118 
3119 	if (!is_writing_gitmodules_ok())
3120 		die(_("please make sure that the .gitmodules file is in the working tree"));
3121 
3122 	key = xstrfmt("submodule.%s.%s", name, var);
3123 	ret = config_set_in_gitmodules_file_gently(key, value);
3124 	free(key);
3125 
3126 	return ret;
3127 }
3128 
configure_added_submodule(struct add_data * add_data)3129 static void configure_added_submodule(struct add_data *add_data)
3130 {
3131 	char *key;
3132 	char *val = NULL;
3133 	struct child_process add_submod = CHILD_PROCESS_INIT;
3134 	struct child_process add_gitmodules = CHILD_PROCESS_INIT;
3135 
3136 	key = xstrfmt("submodule.%s.url", add_data->sm_name);
3137 	git_config_set_gently(key, add_data->realrepo);
3138 	free(key);
3139 
3140 	add_submod.git_cmd = 1;
3141 	strvec_pushl(&add_submod.args, "add",
3142 		     "--no-warn-embedded-repo", NULL);
3143 	if (add_data->force)
3144 		strvec_push(&add_submod.args, "--force");
3145 	strvec_pushl(&add_submod.args, "--", add_data->sm_path, NULL);
3146 
3147 	if (run_command(&add_submod))
3148 		die(_("Failed to add submodule '%s'"), add_data->sm_path);
3149 
3150 	if (config_submodule_in_gitmodules(add_data->sm_name, "path", add_data->sm_path) ||
3151 	    config_submodule_in_gitmodules(add_data->sm_name, "url", add_data->repo))
3152 		die(_("Failed to register submodule '%s'"), add_data->sm_path);
3153 
3154 	if (add_data->branch) {
3155 		if (config_submodule_in_gitmodules(add_data->sm_name,
3156 						   "branch", add_data->branch))
3157 			die(_("Failed to register submodule '%s'"), add_data->sm_path);
3158 	}
3159 
3160 	add_gitmodules.git_cmd = 1;
3161 	strvec_pushl(&add_gitmodules.args,
3162 		     "add", "--force", "--", ".gitmodules", NULL);
3163 
3164 	if (run_command(&add_gitmodules))
3165 		die(_("Failed to register submodule '%s'"), add_data->sm_path);
3166 
3167 	/*
3168 	 * NEEDSWORK: In a multi-working-tree world this needs to be
3169 	 * set in the per-worktree config.
3170 	 */
3171 	/*
3172 	 * NEEDSWORK: In the longer run, we need to get rid of this
3173 	 * pattern of querying "submodule.active" before calling
3174 	 * is_submodule_active(), since that function needs to find
3175 	 * out the value of "submodule.active" again anyway.
3176 	 */
3177 	if (!git_config_get_string("submodule.active", &val) && val) {
3178 		/*
3179 		 * If the submodule being added isn't already covered by the
3180 		 * current configured pathspec, set the submodule's active flag
3181 		 */
3182 		if (!is_submodule_active(the_repository, add_data->sm_path)) {
3183 			key = xstrfmt("submodule.%s.active", add_data->sm_name);
3184 			git_config_set_gently(key, "true");
3185 			free(key);
3186 		}
3187 	} else {
3188 		key = xstrfmt("submodule.%s.active", add_data->sm_name);
3189 		git_config_set_gently(key, "true");
3190 		free(key);
3191 	}
3192 }
3193 
die_on_index_match(const char * path,int force)3194 static void die_on_index_match(const char *path, int force)
3195 {
3196 	struct pathspec ps;
3197 	const char *args[] = { path, NULL };
3198 	parse_pathspec(&ps, 0, PATHSPEC_PREFER_CWD, NULL, args);
3199 
3200 	if (read_cache_preload(NULL) < 0)
3201 		die(_("index file corrupt"));
3202 
3203 	if (ps.nr) {
3204 		int i;
3205 		char *ps_matched = xcalloc(ps.nr, 1);
3206 
3207 		/* TODO: audit for interaction with sparse-index. */
3208 		ensure_full_index(&the_index);
3209 
3210 		/*
3211 		 * Since there is only one pathspec, we just need
3212 		 * need to check ps_matched[0] to know if a cache
3213 		 * entry matched.
3214 		 */
3215 		for (i = 0; i < active_nr; i++) {
3216 			ce_path_match(&the_index, active_cache[i], &ps,
3217 				      ps_matched);
3218 
3219 			if (ps_matched[0]) {
3220 				if (!force)
3221 					die(_("'%s' already exists in the index"),
3222 					    path);
3223 				if (!S_ISGITLINK(active_cache[i]->ce_mode))
3224 					die(_("'%s' already exists in the index "
3225 					      "and is not a submodule"), path);
3226 				break;
3227 			}
3228 		}
3229 		free(ps_matched);
3230 	}
3231 	clear_pathspec(&ps);
3232 }
3233 
die_on_repo_without_commits(const char * path)3234 static void die_on_repo_without_commits(const char *path)
3235 {
3236 	struct strbuf sb = STRBUF_INIT;
3237 	strbuf_addstr(&sb, path);
3238 	if (is_nonbare_repository_dir(&sb)) {
3239 		struct object_id oid;
3240 		if (resolve_gitlink_ref(path, "HEAD", &oid) < 0)
3241 			die(_("'%s' does not have a commit checked out"), path);
3242 	}
3243 	strbuf_release(&sb);
3244 }
3245 
module_add(int argc,const char ** argv,const char * prefix)3246 static int module_add(int argc, const char **argv, const char *prefix)
3247 {
3248 	int force = 0, quiet = 0, progress = 0, dissociate = 0;
3249 	struct add_data add_data = ADD_DATA_INIT;
3250 
3251 	struct option options[] = {
3252 		OPT_STRING('b', "branch", &add_data.branch, N_("branch"),
3253 			   N_("branch of repository to add as submodule")),
3254 		OPT__FORCE(&force, N_("allow adding an otherwise ignored submodule path"),
3255 			   PARSE_OPT_NOCOMPLETE),
3256 		OPT__QUIET(&quiet, N_("print only error messages")),
3257 		OPT_BOOL(0, "progress", &progress, N_("force cloning progress")),
3258 		OPT_STRING(0, "reference", &add_data.reference_path, N_("repository"),
3259 			   N_("reference repository")),
3260 		OPT_BOOL(0, "dissociate", &dissociate, N_("borrow the objects from reference repositories")),
3261 		OPT_STRING(0, "name", &add_data.sm_name, N_("name"),
3262 			   N_("sets the submodule’s name to the given string "
3263 			      "instead of defaulting to its path")),
3264 		OPT_INTEGER(0, "depth", &add_data.depth, N_("depth for shallow clones")),
3265 		OPT_END()
3266 	};
3267 
3268 	const char *const usage[] = {
3269 		N_("git submodule--helper add [<options>] [--] <repository> [<path>]"),
3270 		NULL
3271 	};
3272 
3273 	argc = parse_options(argc, argv, prefix, options, usage, 0);
3274 
3275 	if (!is_writing_gitmodules_ok())
3276 		die(_("please make sure that the .gitmodules file is in the working tree"));
3277 
3278 	if (prefix && *prefix &&
3279 	    add_data.reference_path && !is_absolute_path(add_data.reference_path))
3280 		add_data.reference_path = xstrfmt("%s%s", prefix, add_data.reference_path);
3281 
3282 	if (argc == 0 || argc > 2)
3283 		usage_with_options(usage, options);
3284 
3285 	add_data.repo = argv[0];
3286 	if (argc == 1)
3287 		add_data.sm_path = git_url_basename(add_data.repo, 0, 0);
3288 	else
3289 		add_data.sm_path = xstrdup(argv[1]);
3290 
3291 	if (prefix && *prefix && !is_absolute_path(add_data.sm_path))
3292 		add_data.sm_path = xstrfmt("%s%s", prefix, add_data.sm_path);
3293 
3294 	if (starts_with_dot_dot_slash(add_data.repo) ||
3295 	    starts_with_dot_slash(add_data.repo)) {
3296 		if (prefix)
3297 			die(_("Relative path can only be used from the toplevel "
3298 			      "of the working tree"));
3299 
3300 		/* dereference source url relative to parent's url */
3301 		add_data.realrepo = resolve_relative_url(add_data.repo, NULL, 1);
3302 	} else if (is_dir_sep(add_data.repo[0]) || strchr(add_data.repo, ':')) {
3303 		add_data.realrepo = add_data.repo;
3304 	} else {
3305 		die(_("repo URL: '%s' must be absolute or begin with ./|../"),
3306 		    add_data.repo);
3307 	}
3308 
3309 	/*
3310 	 * normalize path:
3311 	 * multiple //; leading ./; /./; /../;
3312 	 */
3313 	normalize_path_copy(add_data.sm_path, add_data.sm_path);
3314 	strip_dir_trailing_slashes(add_data.sm_path);
3315 
3316 	die_on_index_match(add_data.sm_path, force);
3317 	die_on_repo_without_commits(add_data.sm_path);
3318 
3319 	if (!force) {
3320 		int exit_code = -1;
3321 		struct strbuf sb = STRBUF_INIT;
3322 		struct child_process cp = CHILD_PROCESS_INIT;
3323 		cp.git_cmd = 1;
3324 		cp.no_stdout = 1;
3325 		strvec_pushl(&cp.args, "add", "--dry-run", "--ignore-missing",
3326 			     "--no-warn-embedded-repo", add_data.sm_path, NULL);
3327 		if ((exit_code = pipe_command(&cp, NULL, 0, NULL, 0, &sb, 0))) {
3328 			strbuf_complete_line(&sb);
3329 			fputs(sb.buf, stderr);
3330 			free(add_data.sm_path);
3331 			return exit_code;
3332 		}
3333 		strbuf_release(&sb);
3334 	}
3335 
3336 	if(!add_data.sm_name)
3337 		add_data.sm_name = add_data.sm_path;
3338 
3339 	if (check_submodule_name(add_data.sm_name))
3340 		die(_("'%s' is not a valid submodule name"), add_data.sm_name);
3341 
3342 	add_data.prefix = prefix;
3343 	add_data.force = !!force;
3344 	add_data.quiet = !!quiet;
3345 	add_data.progress = !!progress;
3346 	add_data.dissociate = !!dissociate;
3347 
3348 	if (add_submodule(&add_data)) {
3349 		free(add_data.sm_path);
3350 		return 1;
3351 	}
3352 	configure_added_submodule(&add_data);
3353 	free(add_data.sm_path);
3354 
3355 	return 0;
3356 }
3357 
3358 #define SUPPORT_SUPER_PREFIX (1<<0)
3359 
3360 struct cmd_struct {
3361 	const char *cmd;
3362 	int (*fn)(int, const char **, const char *);
3363 	unsigned option;
3364 };
3365 
3366 static struct cmd_struct commands[] = {
3367 	{"list", module_list, 0},
3368 	{"name", module_name, 0},
3369 	{"clone", module_clone, 0},
3370 	{"add", module_add, SUPPORT_SUPER_PREFIX},
3371 	{"update-module-mode", module_update_module_mode, 0},
3372 	{"update-clone", update_clone, 0},
3373 	{"run-update-procedure", run_update_procedure, 0},
3374 	{"ensure-core-worktree", ensure_core_worktree, 0},
3375 	{"relative-path", resolve_relative_path, 0},
3376 	{"resolve-relative-url-test", resolve_relative_url_test, 0},
3377 	{"foreach", module_foreach, SUPPORT_SUPER_PREFIX},
3378 	{"init", module_init, SUPPORT_SUPER_PREFIX},
3379 	{"status", module_status, SUPPORT_SUPER_PREFIX},
3380 	{"print-default-remote", print_default_remote, 0},
3381 	{"sync", module_sync, SUPPORT_SUPER_PREFIX},
3382 	{"deinit", module_deinit, 0},
3383 	{"summary", module_summary, SUPPORT_SUPER_PREFIX},
3384 	{"remote-branch", resolve_remote_submodule_branch, 0},
3385 	{"push-check", push_check, 0},
3386 	{"absorb-git-dirs", absorb_git_dirs, SUPPORT_SUPER_PREFIX},
3387 	{"is-active", is_active, 0},
3388 	{"check-name", check_name, 0},
3389 	{"config", module_config, 0},
3390 	{"set-url", module_set_url, 0},
3391 	{"set-branch", module_set_branch, 0},
3392 };
3393 
cmd_submodule__helper(int argc,const char ** argv,const char * prefix)3394 int cmd_submodule__helper(int argc, const char **argv, const char *prefix)
3395 {
3396 	int i;
3397 	if (argc < 2 || !strcmp(argv[1], "-h"))
3398 		usage("git submodule--helper <command>");
3399 
3400 	for (i = 0; i < ARRAY_SIZE(commands); i++) {
3401 		if (!strcmp(argv[1], commands[i].cmd)) {
3402 			if (get_super_prefix() &&
3403 			    !(commands[i].option & SUPPORT_SUPER_PREFIX))
3404 				die(_("%s doesn't support --super-prefix"),
3405 				    commands[i].cmd);
3406 			return commands[i].fn(argc - 1, argv + 1, prefix);
3407 		}
3408 	}
3409 
3410 	die(_("'%s' is not a valid submodule--helper "
3411 	      "subcommand"), argv[1]);
3412 }
3413