diff options
author | Max Kirillov <max@max630.net> | 2015-09-14 01:17:42 +0300 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2015-09-14 11:03:46 -0700 |
commit | 11f9dd719104a960d3e2b478477d9055141d1dbc (patch) | |
tree | a8a9549888fdfe7acda74ad4a0fed457c2f8c55e /setup.c | |
parent | 35fb4d2e3d4a3cd008ec0baa077939f60a64f244 (diff) | |
download | git-11f9dd719104a960d3e2b478477d9055141d1dbc.tar.gz |
path: implement common_dir handling in git_pathdup_submodule()mk/submodule-gitdir-path
When submodule is a linked worktree, "git diff --submodule" and other
calls which directly access the submodule's object database do not correctly
calculate its path. Fix it by changing the git_pathdup_submodule() behavior,
to use either common or per-worktree directory.
Do it similarly as for parent repository, but ignore the GIT_COMMON_DIR
environment variable, because it would mean common directory for the parent
repository and does not make sense for submodule.
Also add test for functionality which uses this call.
Signed-off-by: Max Kirillov <max@max630.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'setup.c')
-rw-r--r-- | setup.c | 17 |
1 files changed, 12 insertions, 5 deletions
@@ -229,14 +229,21 @@ void verify_non_filename(const char *prefix, const char *arg) int get_common_dir(struct strbuf *sb, const char *gitdir) { + const char *git_env_common_dir = getenv(GIT_COMMON_DIR_ENVIRONMENT); + if (git_env_common_dir) { + strbuf_addstr(sb, git_env_common_dir); + return 1; + } else { + return get_common_dir_noenv(sb, gitdir); + } +} + +int get_common_dir_noenv(struct strbuf *sb, const char *gitdir) +{ struct strbuf data = STRBUF_INIT; struct strbuf path = STRBUF_INIT; - const char *git_common_dir = getenv(GIT_COMMON_DIR_ENVIRONMENT); int ret = 0; - if (git_common_dir) { - strbuf_addstr(sb, git_common_dir); - return 1; - } + strbuf_addf(&path, "%s/commondir", gitdir); if (file_exists(path.buf)) { if (strbuf_read_file(&data, path.buf, 0) <= 0) |