path.c: move some code out of strbuf_git_path_submodule()
refs is learning to avoid path rewriting that is done by strbuf_git_path_submodule(). Factor out this code so it could be reused by refs_* functions. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									077be78d7f
								
							
						
					
					
						commit
						bbbb7de7ac
					
				
							
								
								
									
										35
									
								
								path.c
								
								
								
								
							
							
						
						
									
										35
									
								
								path.c
								
								
								
								
							|  | @ -471,39 +471,19 @@ const char *worktree_git_path(const struct worktree *wt, const char *fmt, ...) | |||
| } | ||||
|  | ||||
| /* Returns 0 on success, negative on failure. */ | ||||
| #define SUBMODULE_PATH_ERR_NOT_CONFIGURED -1 | ||||
| static int do_submodule_path(struct strbuf *buf, const char *path, | ||||
| 			     const char *fmt, va_list args) | ||||
| { | ||||
| 	const char *git_dir; | ||||
| 	struct strbuf git_submodule_common_dir = STRBUF_INIT; | ||||
| 	struct strbuf git_submodule_dir = STRBUF_INIT; | ||||
| 	const struct submodule *sub; | ||||
| 	int err = 0; | ||||
| 	int ret; | ||||
|  | ||||
| 	strbuf_addstr(buf, path); | ||||
| 	strbuf_complete(buf, '/'); | ||||
| 	strbuf_addstr(buf, ".git"); | ||||
|  | ||||
| 	git_dir = read_gitfile(buf->buf); | ||||
| 	if (git_dir) { | ||||
| 		strbuf_reset(buf); | ||||
| 		strbuf_addstr(buf, git_dir); | ||||
| 	} | ||||
| 	if (!is_git_directory(buf->buf)) { | ||||
| 		gitmodules_config(); | ||||
| 		sub = submodule_from_path(null_sha1, path); | ||||
| 		if (!sub) { | ||||
| 			err = SUBMODULE_PATH_ERR_NOT_CONFIGURED; | ||||
| 			goto cleanup; | ||||
| 		} | ||||
| 		strbuf_reset(buf); | ||||
| 		strbuf_git_path(buf, "%s/%s", "modules", sub->name); | ||||
| 	} | ||||
|  | ||||
| 	strbuf_addch(buf, '/'); | ||||
| 	strbuf_addbuf(&git_submodule_dir, buf); | ||||
| 	ret = submodule_to_gitdir(&git_submodule_dir, path); | ||||
| 	if (ret) | ||||
| 		goto cleanup; | ||||
|  | ||||
| 	strbuf_complete(&git_submodule_dir, '/'); | ||||
| 	strbuf_addbuf(buf, &git_submodule_dir); | ||||
| 	strbuf_vaddf(buf, fmt, args); | ||||
|  | ||||
| 	if (get_common_dir_noenv(&git_submodule_common_dir, git_submodule_dir.buf)) | ||||
|  | @ -514,8 +494,7 @@ static int do_submodule_path(struct strbuf *buf, const char *path, | |||
| cleanup: | ||||
| 	strbuf_release(&git_submodule_dir); | ||||
| 	strbuf_release(&git_submodule_common_dir); | ||||
|  | ||||
| 	return err; | ||||
| 	return ret; | ||||
| } | ||||
|  | ||||
| char *git_pathdup_submodule(const char *path, const char *fmt, ...) | ||||
|  |  | |||
							
								
								
									
										31
									
								
								submodule.c
								
								
								
								
							
							
						
						
									
										31
									
								
								submodule.c
								
								
								
								
							|  | @ -1596,3 +1596,34 @@ const char *get_superproject_working_tree(void) | |||
|  | ||||
| 	return ret; | ||||
| } | ||||
|  | ||||
| int submodule_to_gitdir(struct strbuf *buf, const char *submodule) | ||||
| { | ||||
| 	const struct submodule *sub; | ||||
| 	const char *git_dir; | ||||
| 	int ret = 0; | ||||
|  | ||||
| 	strbuf_reset(buf); | ||||
| 	strbuf_addstr(buf, submodule); | ||||
| 	strbuf_complete(buf, '/'); | ||||
| 	strbuf_addstr(buf, ".git"); | ||||
|  | ||||
| 	git_dir = read_gitfile(buf->buf); | ||||
| 	if (git_dir) { | ||||
| 		strbuf_reset(buf); | ||||
| 		strbuf_addstr(buf, git_dir); | ||||
| 	} | ||||
| 	if (!is_git_directory(buf->buf)) { | ||||
| 		gitmodules_config(); | ||||
| 		sub = submodule_from_path(null_sha1, submodule); | ||||
| 		if (!sub) { | ||||
| 			ret = -1; | ||||
| 			goto cleanup; | ||||
| 		} | ||||
| 		strbuf_reset(buf); | ||||
| 		strbuf_git_path(buf, "%s/%s", "modules", sub->name); | ||||
| 	} | ||||
|  | ||||
| cleanup: | ||||
| 	return ret; | ||||
| } | ||||
|  |  | |||
|  | @ -81,6 +81,12 @@ extern int push_unpushed_submodules(struct sha1_array *commits, | |||
| 				    int dry_run); | ||||
| extern void connect_work_tree_and_git_dir(const char *work_tree, const char *git_dir); | ||||
| extern int parallel_submodules(void); | ||||
| /* | ||||
|  * Given a submodule path (as in the index), return the repository | ||||
|  * path of that submodule in 'buf'. Return -1 on error or when the | ||||
|  * submodule is not initialized. | ||||
|  */ | ||||
| int submodule_to_gitdir(struct strbuf *buf, const char *submodule); | ||||
|  | ||||
| /* | ||||
|  * Prepare the "env_array" parameter of a "struct child_process" for executing | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Nguyễn Thái Ngọc Duy
						Nguyễn Thái Ngọc Duy