From: Stefan Beller <sbeller@google.com>
To: git@vger.kernel.org, gitster@pobox.com
Cc: sunshine@sunshineco.com, jacob.keller@gmail.com,
norio.nomura@gmail.com, Stefan Beller <sbeller@google.com>
Subject: [PATCHv2 4/5] submodule--helper, module_clone: always operate on absolute paths
Date: Thu, 31 Mar 2016 14:04:39 -0700 [thread overview]
Message-ID: <1459458280-17619-5-git-send-email-sbeller@google.com> (raw)
In-Reply-To: <1459458280-17619-1-git-send-email-sbeller@google.com>
When giving relative paths to `relative_path` to compute a relative path
from one directory to another, this may fail in `relative_path`.
Make sure both arguments to `relative_path` are always absolute.
Signed-off-by: Stefan Beller <sbeller@google.com>
---
Notes:
Notice how the 2 relative path calls
relative_path(sm_gitdir, path, &rel_path)
relative_path(path, sm_gitdir, &rel_path)
now have the same arguments, just switched?
The symmetry there looks nice to read.
This proposal is slightly more code than the previous patch,
but looking at the end result
builtin/submodule--helper.c | 36 +++++++++++++++++++++++-------------
t/t7400-submodule-basic.sh | 2 +-
2 files changed, 24 insertions(+), 14 deletions(-)
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index 0b9f546..56c3033 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -157,8 +157,8 @@ static int module_clone(int argc, const char **argv, const char *prefix)
const char *reference = NULL, *depth = NULL;
int quiet = 0;
FILE *submodule_dot_git;
- char *sm_gitdir, *cwd, *p;
- struct strbuf rel_path = STRBUF_INIT;
+ char *sm_gitdir, *p;
+ struct strbuf rel_path = STRBUF_INIT; /* for relative_path */
struct strbuf sb = STRBUF_INIT;
struct option module_clone_options[] = {
@@ -200,6 +200,25 @@ static int module_clone(int argc, const char **argv, const char *prefix)
strbuf_addf(&sb, "%s/modules/%s", get_git_dir(), name);
sm_gitdir = strbuf_detach(&sb, NULL);
+
+ if (!is_absolute_path(sm_gitdir)) {
+ char *cwd = xgetcwd();
+ strbuf_addf(&sb, "%s/%s", cwd, sm_gitdir);
+ sm_gitdir = strbuf_detach(&sb, 0);
+ free(cwd);
+ }
+
+ if (!is_absolute_path(path)) {
+ /*
+ * TODO: add prefix here once we allow calling from non root
+ * directory?
+ */
+ strbuf_addf(&sb, "%s/%s",
+ get_git_work_tree(),
+ path);
+ path = strbuf_detach(&sb, 0);
+ }
+
if (!file_exists(sm_gitdir)) {
if (safe_create_leading_directories_const(sm_gitdir) < 0)
die(_("could not create directory '%s'"), sm_gitdir);
@@ -221,7 +240,6 @@ static int module_clone(int argc, const char **argv, const char *prefix)
submodule_dot_git = fopen(sb.buf, "w");
if (!submodule_dot_git)
die_errno(_("cannot open file '%s'"), sb.buf);
-
fprintf(submodule_dot_git, "gitdir: %s\n",
relative_path(sm_gitdir, path, &rel_path));
if (fclose(submodule_dot_git))
@@ -229,24 +247,16 @@ static int module_clone(int argc, const char **argv, const char *prefix)
strbuf_reset(&sb);
strbuf_reset(&rel_path);
- cwd = xgetcwd();
/* Redirect the worktree of the submodule in the superproject's config */
- if (!is_absolute_path(sm_gitdir)) {
- strbuf_addf(&sb, "%s/%s", cwd, sm_gitdir);
- free(sm_gitdir);
- sm_gitdir = strbuf_detach(&sb, NULL);
- }
-
- strbuf_addf(&sb, "%s/%s", cwd, path);
p = git_pathdup_submodule(path, "config");
if (!p)
die(_("could not get submodule directory for '%s'"), path);
git_config_set_in_file(p, "core.worktree",
- relative_path(sb.buf, sm_gitdir, &rel_path));
+ relative_path(path, sm_gitdir, &rel_path));
strbuf_release(&sb);
strbuf_release(&rel_path);
free(sm_gitdir);
- free(cwd);
+
free(p);
return 0;
}
diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh
index fc11809..ea3fabb 100755
--- a/t/t7400-submodule-basic.sh
+++ b/t/t7400-submodule-basic.sh
@@ -818,7 +818,7 @@ test_expect_success 'submodule add --name allows to replace a submodule with ano
)
'
-test_expect_failure 'recursive relative submodules stay relative' '
+test_expect_success 'recursive relative submodules stay relative' '
test_when_finished "rm -rf super clone2 subsub sub3" &&
mkdir subsub &&
(
--
2.5.0.264.g39f00fe
next prev parent reply other threads:[~2016-03-31 21:05 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-31 21:04 [PATCHv2 0/5] Fix relative path issues in recursive submodules Stefan Beller
2016-03-31 21:04 ` [PATCHv2 1/5] recursive submodules: test for relative paths Stefan Beller
2016-03-31 21:04 ` [PATCHv2 2/5] submodule--helper clone: simplify path check Stefan Beller
2016-03-31 21:23 ` Eric Sunshine
2016-03-31 21:04 ` [PATCHv2 3/5] submodule--helper clone: remove double path checking Stefan Beller
2016-03-31 21:58 ` Eric Sunshine
2016-03-31 22:21 ` Junio C Hamano
2016-03-31 21:04 ` Stefan Beller [this message]
2016-03-31 22:26 ` [PATCHv2 4/5] submodule--helper, module_clone: always operate on absolute paths Junio C Hamano
2016-03-31 22:59 ` Stefan Beller
2016-03-31 23:08 ` Stefan Beller
2016-03-31 21:04 ` [PATCHv2 5/5] submodule--helper, module_clone: catch fprintf failure Stefan Beller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1459458280-17619-5-git-send-email-sbeller@google.com \
--to=sbeller@google.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jacob.keller@gmail.com \
--cc=norio.nomura@gmail.com \
--cc=sunshine@sunshineco.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).