submodule--helper: introduce new update-module-mode helper
This chews off a bit of the shell part of the update command in git-submodule.sh. When writing the C code, keep in mind that the submodule--helper part will go away eventually and we want to have a C function that is able to determine the submodule update strategy, it as a nicety, make determine_submodule_update_strategy accessible for arbitrary repositories. Signed-off-by: Stefan Beller <sbeller@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									74d4731da1
								
							
						
					
					
						commit
						ee69b2a90c
					
				|  | @ -1446,6 +1446,66 @@ static int module_clone(int argc, const char **argv, const char *prefix) | |||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static void determine_submodule_update_strategy(struct repository *r, | ||||
| 						int just_cloned, | ||||
| 						const char *path, | ||||
| 						const char *update, | ||||
| 						struct submodule_update_strategy *out) | ||||
| { | ||||
| 	const struct submodule *sub = submodule_from_path(r, &null_oid, path); | ||||
| 	char *key; | ||||
| 	const char *val; | ||||
|  | ||||
| 	key = xstrfmt("submodule.%s.update", sub->name); | ||||
|  | ||||
| 	if (update) { | ||||
| 		trace_printf("parsing update"); | ||||
| 		if (parse_submodule_update_strategy(update, out) < 0) | ||||
| 			die(_("Invalid update mode '%s' for submodule path '%s'"), | ||||
| 				update, path); | ||||
| 	} else if (!repo_config_get_string_const(r, key, &val)) { | ||||
| 		if (parse_submodule_update_strategy(val, out) < 0) | ||||
| 			die(_("Invalid update mode '%s' configured for submodule path '%s'"), | ||||
| 				val, path); | ||||
| 	} else if (sub->update_strategy.type != SM_UPDATE_UNSPECIFIED) { | ||||
| 		trace_printf("loaded thing"); | ||||
| 		out->type = sub->update_strategy.type; | ||||
| 		out->command = sub->update_strategy.command; | ||||
| 	} else | ||||
| 		out->type = SM_UPDATE_CHECKOUT; | ||||
|  | ||||
| 	if (just_cloned && | ||||
| 	    (out->type == SM_UPDATE_MERGE || | ||||
| 	     out->type == SM_UPDATE_REBASE || | ||||
| 	     out->type == SM_UPDATE_NONE)) | ||||
| 		out->type = SM_UPDATE_CHECKOUT; | ||||
|  | ||||
| 	free(key); | ||||
| } | ||||
|  | ||||
| static int module_update_module_mode(int argc, const char **argv, const char *prefix) | ||||
| { | ||||
| 	const char *path, *update = NULL; | ||||
| 	int just_cloned; | ||||
| 	struct submodule_update_strategy update_strategy = { .type = SM_UPDATE_CHECKOUT }; | ||||
|  | ||||
| 	if (argc < 3 || argc > 4) | ||||
| 		die("submodule--helper update-module-clone expects <just-cloned> <path> [<update>]"); | ||||
|  | ||||
| 	just_cloned = git_config_int("just_cloned", argv[1]); | ||||
| 	path = argv[2]; | ||||
|  | ||||
| 	if (argc == 4) | ||||
| 		update = argv[3]; | ||||
|  | ||||
| 	determine_submodule_update_strategy(the_repository, | ||||
| 					    just_cloned, path, update, | ||||
| 					    &update_strategy); | ||||
| 	fputs(submodule_strategy_to_string(&update_strategy), stdout); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| struct update_clone_data { | ||||
| 	const struct submodule *sub; | ||||
| 	struct object_id oid; | ||||
|  | @ -2080,6 +2140,7 @@ static struct cmd_struct commands[] = { | |||
| 	{"list", module_list, 0}, | ||||
| 	{"name", module_name, 0}, | ||||
| 	{"clone", module_clone, 0}, | ||||
| 	{"update-module-mode", module_update_module_mode, 0}, | ||||
| 	{"update-clone", update_clone, 0}, | ||||
| 	{"ensure-core-worktree", ensure_core_worktree, 0}, | ||||
| 	{"relative-path", resolve_relative_path, 0}, | ||||
|  |  | |||
|  | @ -537,27 +537,13 @@ cmd_update() | |||
|  | ||||
| 		git submodule--helper ensure-core-worktree "$sm_path" | ||||
|  | ||||
| 		name=$(git submodule--helper name "$sm_path") || exit | ||||
| 		if ! test -z "$update" | ||||
| 		then | ||||
| 			update_module=$update | ||||
| 		else | ||||
| 			update_module=$(git config submodule."$name".update) | ||||
| 			if test -z "$update_module" | ||||
| 			then | ||||
| 				update_module="checkout" | ||||
| 			fi | ||||
| 		fi | ||||
| 		update_module=$(git submodule--helper update-module-mode $just_cloned "$sm_path" $update) | ||||
|  | ||||
| 		displaypath=$(git submodule--helper relative-path "$prefix$sm_path" "$wt_prefix") | ||||
|  | ||||
| 		if test $just_cloned -eq 1 | ||||
| 		then | ||||
| 			subsha1= | ||||
| 			case "$update_module" in | ||||
| 			merge | rebase | none) | ||||
| 				update_module=checkout ;; | ||||
| 			esac | ||||
| 		else | ||||
| 			subsha1=$(sanitize_submodule_env; cd "$sm_path" && | ||||
| 				git rev-parse --verify HEAD) || | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Stefan Beller
						Stefan Beller