repository: support unabsorbed in repo_submodule_init
In preparation for a subsequent commit that migrates code using add_submodule_odb() to repo_submodule_init(), teach repo_submodule_init() to support submodules with unabsorbed gitdirs. (See the documentation for "git submodule absorbgitdirs" for more information about absorbed and unabsorbed gitdirs.) Signed-off-by: Jonathan Tan <jonathantanmy@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									5df5106e1e
								
							
						
					
					
						commit
						8eb8dcf946
					
				|  | @ -433,17 +433,14 @@ static int grep_submodule(struct grep_opt *opt, | ||||||
| { | { | ||||||
| 	struct repository *subrepo; | 	struct repository *subrepo; | ||||||
| 	struct repository *superproject = opt->repo; | 	struct repository *superproject = opt->repo; | ||||||
| 	const struct submodule *sub; |  | ||||||
| 	struct grep_opt subopt; | 	struct grep_opt subopt; | ||||||
| 	int hit = 0; | 	int hit = 0; | ||||||
|  |  | ||||||
| 	sub = submodule_from_path(superproject, null_oid(), path); |  | ||||||
|  |  | ||||||
| 	if (!is_submodule_active(superproject, path)) | 	if (!is_submodule_active(superproject, path)) | ||||||
| 		return 0; | 		return 0; | ||||||
|  |  | ||||||
| 	subrepo = xmalloc(sizeof(*subrepo)); | 	subrepo = xmalloc(sizeof(*subrepo)); | ||||||
| 	if (repo_submodule_init(subrepo, superproject, sub)) { | 	if (repo_submodule_init(subrepo, superproject, path, null_oid())) { | ||||||
| 		free(subrepo); | 		free(subrepo); | ||||||
| 		return 0; | 		return 0; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -209,10 +209,8 @@ static void show_submodule(struct repository *superproject, | ||||||
| 			   struct dir_struct *dir, const char *path) | 			   struct dir_struct *dir, const char *path) | ||||||
| { | { | ||||||
| 	struct repository subrepo; | 	struct repository subrepo; | ||||||
| 	const struct submodule *sub = submodule_from_path(superproject, |  | ||||||
| 							  null_oid(), path); |  | ||||||
|  |  | ||||||
| 	if (repo_submodule_init(&subrepo, superproject, sub)) | 	if (repo_submodule_init(&subrepo, superproject, path, null_oid())) | ||||||
| 		return; | 		return; | ||||||
|  |  | ||||||
| 	if (repo_read_index(&subrepo) < 0) | 	if (repo_read_index(&subrepo) < 0) | ||||||
|  |  | ||||||
|  | @ -2540,7 +2540,6 @@ static int push_check(int argc, const char **argv, const char *prefix) | ||||||
|  |  | ||||||
| static int ensure_core_worktree(int argc, const char **argv, const char *prefix) | static int ensure_core_worktree(int argc, const char **argv, const char *prefix) | ||||||
| { | { | ||||||
| 	const struct submodule *sub; |  | ||||||
| 	const char *path; | 	const char *path; | ||||||
| 	const char *cw; | 	const char *cw; | ||||||
| 	struct repository subrepo; | 	struct repository subrepo; | ||||||
|  | @ -2550,11 +2549,7 @@ static int ensure_core_worktree(int argc, const char **argv, const char *prefix) | ||||||
|  |  | ||||||
| 	path = argv[1]; | 	path = argv[1]; | ||||||
|  |  | ||||||
| 	sub = submodule_from_path(the_repository, null_oid(), path); | 	if (repo_submodule_init(&subrepo, the_repository, path, null_oid())) | ||||||
| 	if (!sub) |  | ||||||
| 		BUG("We could get the submodule handle before?"); |  | ||||||
|  |  | ||||||
| 	if (repo_submodule_init(&subrepo, the_repository, sub)) |  | ||||||
| 		die(_("could not get a repository handle for submodule '%s'"), path); | 		die(_("could not get a repository handle for submodule '%s'"), path); | ||||||
|  |  | ||||||
| 	if (!repo_config_get_string_tmp(&subrepo, "core.worktree", &cw)) { | 	if (!repo_config_get_string_tmp(&subrepo, "core.worktree", &cw)) { | ||||||
|  |  | ||||||
							
								
								
									
										21
									
								
								repository.c
								
								
								
								
							
							
						
						
									
										21
									
								
								repository.c
								
								
								
								
							|  | @ -190,19 +190,15 @@ error: | ||||||
|  |  | ||||||
| int repo_submodule_init(struct repository *subrepo, | int repo_submodule_init(struct repository *subrepo, | ||||||
| 			struct repository *superproject, | 			struct repository *superproject, | ||||||
| 			const struct submodule *sub) | 			const char *path, | ||||||
|  | 			const struct object_id *treeish_name) | ||||||
| { | { | ||||||
| 	struct strbuf gitdir = STRBUF_INIT; | 	struct strbuf gitdir = STRBUF_INIT; | ||||||
| 	struct strbuf worktree = STRBUF_INIT; | 	struct strbuf worktree = STRBUF_INIT; | ||||||
| 	int ret = 0; | 	int ret = 0; | ||||||
|  |  | ||||||
| 	if (!sub) { | 	strbuf_repo_worktree_path(&gitdir, superproject, "%s/.git", path); | ||||||
| 		ret = -1; | 	strbuf_repo_worktree_path(&worktree, superproject, "%s", path); | ||||||
| 		goto out; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	strbuf_repo_worktree_path(&gitdir, superproject, "%s/.git", sub->path); |  | ||||||
| 	strbuf_repo_worktree_path(&worktree, superproject, "%s", sub->path); |  | ||||||
|  |  | ||||||
| 	if (repo_init(subrepo, gitdir.buf, worktree.buf)) { | 	if (repo_init(subrepo, gitdir.buf, worktree.buf)) { | ||||||
| 		/* | 		/* | ||||||
|  | @ -212,6 +208,13 @@ int repo_submodule_init(struct repository *subrepo, | ||||||
| 		 * in the superproject's 'modules' directory.  In this case the | 		 * in the superproject's 'modules' directory.  In this case the | ||||||
| 		 * submodule would not have a worktree. | 		 * submodule would not have a worktree. | ||||||
| 		 */ | 		 */ | ||||||
|  | 		const struct submodule *sub = | ||||||
|  | 			submodule_from_path(superproject, treeish_name, path); | ||||||
|  | 		if (!sub) { | ||||||
|  | 			ret = -1; | ||||||
|  | 			goto out; | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		strbuf_reset(&gitdir); | 		strbuf_reset(&gitdir); | ||||||
| 		strbuf_repo_git_path(&gitdir, superproject, | 		strbuf_repo_git_path(&gitdir, superproject, | ||||||
| 				     "modules/%s", sub->name); | 				     "modules/%s", sub->name); | ||||||
|  | @ -225,7 +228,7 @@ int repo_submodule_init(struct repository *subrepo, | ||||||
| 	subrepo->submodule_prefix = xstrfmt("%s%s/", | 	subrepo->submodule_prefix = xstrfmt("%s%s/", | ||||||
| 					    superproject->submodule_prefix ? | 					    superproject->submodule_prefix ? | ||||||
| 					    superproject->submodule_prefix : | 					    superproject->submodule_prefix : | ||||||
| 					    "", sub->path); | 					    "", path); | ||||||
|  |  | ||||||
| out: | out: | ||||||
| 	strbuf_release(&gitdir); | 	strbuf_release(&gitdir); | ||||||
|  |  | ||||||
							
								
								
									
										15
									
								
								repository.h
								
								
								
								
							
							
						
						
									
										15
									
								
								repository.h
								
								
								
								
							|  | @ -172,15 +172,18 @@ void initialize_the_repository(void); | ||||||
| int repo_init(struct repository *r, const char *gitdir, const char *worktree); | int repo_init(struct repository *r, const char *gitdir, const char *worktree); | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Initialize the repository 'subrepo' as the submodule given by the |  * Initialize the repository 'subrepo' as the submodule at the given path. If | ||||||
|  * struct submodule 'sub' in parent repository 'superproject'. |  * the submodule's gitdir cannot be found at <path>/.git, this function calls | ||||||
|  * Return 0 upon success and a non-zero value upon failure, which may happen |  * submodule_from_path() to try to find it. treeish_name is only used if | ||||||
|  * if the submodule is not found, or 'sub' is NULL. |  * submodule_from_path() needs to be called; see its documentation for more | ||||||
|  |  * information. | ||||||
|  |  * Return 0 upon success and a non-zero value upon failure. | ||||||
|  */ |  */ | ||||||
| struct submodule; | struct object_id; | ||||||
| int repo_submodule_init(struct repository *subrepo, | int repo_submodule_init(struct repository *subrepo, | ||||||
| 			struct repository *superproject, | 			struct repository *superproject, | ||||||
| 			const struct submodule *sub); | 			const char *path, | ||||||
|  | 			const struct object_id *treeish_name); | ||||||
| void repo_clear(struct repository *repo); | void repo_clear(struct repository *repo); | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  |  | ||||||
|  | @ -520,9 +520,6 @@ static void prepare_submodule_repo_env_in_gitdir(struct strvec *out) | ||||||
| /* | /* | ||||||
|  * Initialize a repository struct for a submodule based on the provided 'path'. |  * Initialize a repository struct for a submodule based on the provided 'path'. | ||||||
|  * |  * | ||||||
|  * Unlike repo_submodule_init, this tolerates submodules not present |  | ||||||
|  * in .gitmodules. This function exists only to preserve historical behavior, |  | ||||||
|  * |  | ||||||
|  * Returns the repository struct on success, |  * Returns the repository struct on success, | ||||||
|  * NULL when the submodule is not present. |  * NULL when the submodule is not present. | ||||||
|  */ |  */ | ||||||
|  | @ -1404,11 +1401,11 @@ static void fetch_task_release(struct fetch_task *p) | ||||||
| } | } | ||||||
|  |  | ||||||
| static struct repository *get_submodule_repo_for(struct repository *r, | static struct repository *get_submodule_repo_for(struct repository *r, | ||||||
| 						 const struct submodule *sub) | 						 const char *path) | ||||||
| { | { | ||||||
| 	struct repository *ret = xmalloc(sizeof(*ret)); | 	struct repository *ret = xmalloc(sizeof(*ret)); | ||||||
|  |  | ||||||
| 	if (repo_submodule_init(ret, r, sub)) { | 	if (repo_submodule_init(ret, r, path, null_oid())) { | ||||||
| 		free(ret); | 		free(ret); | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 	} | 	} | ||||||
|  | @ -1452,7 +1449,7 @@ static int get_next_submodule(struct child_process *cp, | ||||||
| 			continue; | 			continue; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		task->repo = get_submodule_repo_for(spf->r, task->sub); | 		task->repo = get_submodule_repo_for(spf->r, task->sub->path); | ||||||
| 		if (task->repo) { | 		if (task->repo) { | ||||||
| 			struct strbuf submodule_prefix = STRBUF_INIT; | 			struct strbuf submodule_prefix = STRBUF_INIT; | ||||||
| 			child_process_init(cp); | 			child_process_init(cp); | ||||||
|  |  | ||||||
|  | @ -11,15 +11,13 @@ static void die_usage(const char **argv, const char *msg) | ||||||
| int cmd__submodule_nested_repo_config(int argc, const char **argv) | int cmd__submodule_nested_repo_config(int argc, const char **argv) | ||||||
| { | { | ||||||
| 	struct repository subrepo; | 	struct repository subrepo; | ||||||
| 	const struct submodule *sub; |  | ||||||
|  |  | ||||||
| 	if (argc < 3) | 	if (argc < 3) | ||||||
| 		die_usage(argv, "Wrong number of arguments."); | 		die_usage(argv, "Wrong number of arguments."); | ||||||
|  |  | ||||||
| 	setup_git_directory(); | 	setup_git_directory(); | ||||||
|  |  | ||||||
| 	sub = submodule_from_path(the_repository, null_oid(), argv[1]); | 	if (repo_submodule_init(&subrepo, the_repository, argv[1], null_oid())) { | ||||||
| 	if (repo_submodule_init(&subrepo, the_repository, sub)) { |  | ||||||
| 		die_usage(argv, "Submodule not found."); | 		die_usage(argv, "Submodule not found."); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Jonathan Tan
						Jonathan Tan