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>
This commit is contained in:
Nguyễn Thái Ngọc Duy
2017-03-26 09:42:30 +07:00
committed by Junio C Hamano
parent 077be78d7f
commit bbbb7de7ac
3 changed files with 44 additions and 28 deletions

33
path.c
View File

@ -471,39 +471,19 @@ const char *worktree_git_path(const struct worktree *wt, const char *fmt, ...)
} }
/* Returns 0 on success, negative on failure. */ /* 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, static int do_submodule_path(struct strbuf *buf, const char *path,
const char *fmt, va_list args) const char *fmt, va_list args)
{ {
const char *git_dir;
struct strbuf git_submodule_common_dir = STRBUF_INIT; struct strbuf git_submodule_common_dir = STRBUF_INIT;
struct strbuf git_submodule_dir = STRBUF_INIT; struct strbuf git_submodule_dir = STRBUF_INIT;
const struct submodule *sub; int ret;
int err = 0;
strbuf_addstr(buf, path); ret = submodule_to_gitdir(&git_submodule_dir, path);
strbuf_complete(buf, '/'); if (ret)
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; goto cleanup;
}
strbuf_reset(buf);
strbuf_git_path(buf, "%s/%s", "modules", sub->name);
}
strbuf_addch(buf, '/');
strbuf_addbuf(&git_submodule_dir, buf);
strbuf_complete(&git_submodule_dir, '/');
strbuf_addbuf(buf, &git_submodule_dir);
strbuf_vaddf(buf, fmt, args); strbuf_vaddf(buf, fmt, args);
if (get_common_dir_noenv(&git_submodule_common_dir, git_submodule_dir.buf)) 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: cleanup:
strbuf_release(&git_submodule_dir); strbuf_release(&git_submodule_dir);
strbuf_release(&git_submodule_common_dir); strbuf_release(&git_submodule_common_dir);
return ret;
return err;
} }
char *git_pathdup_submodule(const char *path, const char *fmt, ...) char *git_pathdup_submodule(const char *path, const char *fmt, ...)

View File

@ -1596,3 +1596,34 @@ const char *get_superproject_working_tree(void)
return ret; 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;
}

View File

@ -81,6 +81,12 @@ extern int push_unpushed_submodules(struct sha1_array *commits,
int dry_run); int dry_run);
extern void connect_work_tree_and_git_dir(const char *work_tree, const char *git_dir); extern void connect_work_tree_and_git_dir(const char *work_tree, const char *git_dir);
extern int parallel_submodules(void); 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 * Prepare the "env_array" parameter of a "struct child_process" for executing