summaryrefslogtreecommitdiff
path: root/setup.c
diff options
context:
space:
mode:
authorMax Kirillov <max@max630.net>2015-09-13 22:17:42 (GMT)
committerJunio C Hamano <gitster@pobox.com>2015-09-14 18:03:46 (GMT)
commit11f9dd719104a960d3e2b478477d9055141d1dbc (patch)
treea8a9549888fdfe7acda74ad4a0fed457c2f8c55e /setup.c
parent35fb4d2e3d4a3cd008ec0baa077939f60a64f244 (diff)
downloadgit-11f9dd719104a960d3e2b478477d9055141d1dbc.zip
git-11f9dd719104a960d3e2b478477d9055141d1dbc.tar.gz
git-11f9dd719104a960d3e2b478477d9055141d1dbc.tar.bz2
path: implement common_dir handling in git_pathdup_submodule()
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.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/setup.c b/setup.c
index a17c51e..e41e5e1 100644
--- a/setup.c
+++ b/setup.c
@@ -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)