This applies on top of origin/sb/submodule-parallel-update.
By having the `init` functionality in C, we can reference it easier
from other parts in the code.
Thanks for the reviews a long time ago!
Junio,
I fixed the NEEDSWORK comment for relative_url
and thought about the memory allocation
Duy,
I fixed the i18n issues introduced.
Johannes,
I took $PWD instead of absolute paths. According to your last message, this
may still break on Windows for
test_submodule_relative_url "(null)" "$PWD/home2/../remote" "../bundle1"
"$PWD/home2/../bundle1"
There are however no further tests starting with /.
Thanks,
Stefan
Stefan Beller (2):
submodule: port resolve_relative_url from shell to C
submodule: port init from shell to C
builtin/submodule--helper.c | 317 +++++++++++++++++++++++++++++++++++++++++++-
git-submodule.sh | 118 +----------------
submodule.c | 21 +++
submodule.h | 1 +
t/t0060-path-utils.sh | 43 ++++++
5 files changed, 385 insertions(+), 115 deletions(-)
Diff to origin/sb/submodule-init:
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index 213af2e..d942463 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -22,7 +22,7 @@ static char *get_default_remote(void)
const char *refname = resolve_ref_unsafe("HEAD", 0, sha1, &flag);
if (!refname)
- die("No such ref: HEAD");
+ die(_("No such ref: %s"), "HEAD");
/* detached HEAD */
if (!strcmp(refname, "HEAD"))
@@ -94,12 +94,14 @@ static int chop_last_dir(char **remoteurl, int is_relative)
* the superproject working tree otherwise.
*
* NEEDSWORK: This works incorrectly on the domain and protocol part.
- * remote_url url outcome correct
- * http://a.com/b ../c http://a.com/c yes
- * http://a.com/b ../../c http://c no (domain should be kept)
- * http://a.com/b ../../../c http:/c no
- * http://a.com/b ../../../../c http:c no
- * http://a.com/b ../../../../../c .:c no
+ * remote_url url outcome expectation
+ * http://a.com/b ../c http://a.com/c as is
+ * http://a.com/b ../../c http://c error out
+ * http://a.com/b ../../../c http:/c error out
+ * http://a.com/b ../../../../c http:c error out
+ * http://a.com/b ../../../../../c .:c error out
+ * NEEDSWORK: Given how chop_last_dir() works, this function is broken
+ * when a local part has a colon in its path component, too.
*/
static char *relative_url(const char *remote_url,
const char *url,
@@ -146,6 +148,7 @@ static char *relative_url(const char *remote_url,
}
strbuf_reset(&sb);
strbuf_addf(&sb, "%s%s%s", remoteurl, colonsep ? ":" : "/", url);
+ free(remoteurl);
if (starts_with_dot_slash(sb.buf))
out = xstrdup(sb.buf + 2);
@@ -153,7 +156,6 @@ static char *relative_url(const char *remote_url,
out = xstrdup(sb.buf);
strbuf_reset(&sb);
- free(remoteurl);
if (!up_path || !is_relative)
return out;
@@ -299,7 +301,7 @@ static int module_init(int argc, const char **argv, const
char *prefix)
OPT_STRING(0, "prefix", &prefix,
N_("path"),
N_("alternative anchor for relative paths")),
- OPT__QUIET(&quiet, "Suppress output for initialzing a
submodule"),
+ OPT__QUIET(&quiet, N_("Suppress output for initializing a
submodule")),
OPT_END()
};
diff --git a/t/t0060-path-utils.sh b/t/t0060-path-utils.sh
index 8a1579c..579c1fa 100755
--- a/t/t0060-path-utils.sh
+++ b/t/t0060-path-utils.sh
@@ -293,35 +293,36 @@ test_git_path GIT_COMMON_DIR=bar config
bar/config
test_git_path GIT_COMMON_DIR=bar packed-refs bar/packed-refs
test_git_path GIT_COMMON_DIR=bar shallow bar/shallow
-test_submodule_relative_url "(null)" "../foo/bar" "../sub/a/b/c"
"../foo/sub/a/b/c"
+test_submodule_relative_url "../" "../foo" "../submodule" "../../submodule"
+test_submodule_relative_url "../" "../foo/bar" "../submodule"
"../../foo/submodule"
+test_submodule_relative_url "../" "../foo/submodule" "../submodule"
"../../foo/submodule"
+test_submodule_relative_url "../" "./foo" "../submodule" "../submodule"
+test_submodule_relative_url "../" "./foo/bar" "../submodule" "../foo/submodule"
test_submodule_relative_url "../../../" "../foo/bar" "../sub/a/b/c"
"../../../../foo/sub/a/b/c"
+test_submodule_relative_url "../" "$PWD/addtest" "../repo" "$PWD/repo"
+test_submodule_relative_url "../" "foo/bar" "../submodule" "../foo/submodule"
+test_submodule_relative_url "../" "foo" "../submodule" "../submodule"
+
+test_submodule_relative_url "(null)" "../foo/bar" "../sub/a/b/c"
"../foo/sub/a/b/c"
test_submodule_relative_url "(null)" "../foo/bar" "../submodule"
"../foo/submodule"
-test_submodule_relative_url "../" "../foo/bar" "../submodule"
"../../foo/submodule"
test_submodule_relative_url "(null)" "../foo/submodule" "../submodule"
"../foo/submodule"
-test_submodule_relative_url "../" "../foo/submodule" "../submodule"
"../../foo/submodule"
test_submodule_relative_url "(null)" "../foo" "../submodule" "../submodule"
-test_submodule_relative_url "../" "../foo" "../submodule" "../../submodule"
test_submodule_relative_url "(null)" "./foo/bar" "../submodule" "foo/submodule"
-test_submodule_relative_url "../" "./foo/bar" "../submodule" "../foo/submodule"
test_submodule_relative_url "(null)" "./foo" "../submodule" "submodule"
-test_submodule_relative_url "../" "./foo" "../submodule" "../submodule"
test_submodule_relative_url "(null)" "//somewhere else/repo" "../subrepo"
"//somewhere else/subrepo"
-test_submodule_relative_url "(null)" "/u//trash
directory.t7406-submodule-update/subsuper_update_r" "../subsubsuper_update_r"
"/u//trash directory.t7406-submodule-update/subsubsuper_update_r"
-test_submodule_relative_url "(null)" "/u//trash
directory.t7406-submodule-update/super_update_r2" "../subsuper_update_r"
"/u//trash directory.t7406-submodule-update/subsuper_update_r"
-test_submodule_relative_url "(null)" "/u/trash directory.t3600-rm/." "../."
"/u/trash directory.t3600-rm/."
-test_submodule_relative_url "(null)" "/u/trash directory.t3600-rm" "./."
"/u/trash directory.t3600-rm/."
-test_submodule_relative_url "(null)" "/u/trash
directory.t7400-submodule-basic/addtest" "../repo" "/u/trash
directory.t7400-submodule-basic/repo"
-test_submodule_relative_url "../" "/u/trash
directory.t7400-submodule-basic/addtest" "../repo" "/u/trash
directory.t7400-submodule-basic/repo"
-test_submodule_relative_url "(null)" "/u/trash
directory.t7400-submodule-basic" "./å äö" "/u/trash
directory.t7400-submodule-basic/å äö"
-test_submodule_relative_url "(null)" "/u/trash
directory.t7403-submodule-sync/." "../submodule" "/u/trash
directory.t7403-submodule-sync/submodule"
-test_submodule_relative_url "(null)" "/u/trash
directory.t7407-submodule-foreach/submodule" "../submodule" "/u/trash
directory.t7407-submodule-foreach/submodule"
-test_submodule_relative_url "(null)" "/u/trash
directory.t7409-submodule-detached-worktree/home2/../remote" "../bundle1"
"/u/trash directory.t7409-submodule-detached-worktree/home2/../bundle1"
-test_submodule_relative_url "(null)" "/u/trash
directory.t7613-merge-submodule/submodule_update_repo" "./." "/u/trash
directory.t7613-merge-submodule/submodule_update_repo/."
+test_submodule_relative_url "(null)" "$PWD/subsuper_update_r"
"../subsubsuper_update_r" "$PWD/subsubsuper_update_r"
+test_submodule_relative_url "(null)" "$PWD/super_update_r2"
"../subsuper_update_r" "$PWD/subsuper_update_r"
+test_submodule_relative_url "(null)" "$PWD/." "../." "$PWD/."
+test_submodule_relative_url "(null)" "$PWD" "./." "$PWD/."
+test_submodule_relative_url "(null)" "$PWD/addtest" "../repo" "$PWD/repo"
+test_submodule_relative_url "(null)" "$PWD" "./å äö" "$PWD/å äö"
+test_submodule_relative_url "(null)" "$PWD/." "../submodule" "$PWD/submodule"
+test_submodule_relative_url "(null)" "$PWD/submodule" "../submodule"
"$PWD/submodule"
+test_submodule_relative_url "(null)" "$PWD/home2/../remote" "../bundle1"
"$PWD/home2/../bundle1"
+test_submodule_relative_url "(null)" "$PWD/submodule_update_repo" "./."
"$PWD/submodule_update_repo/."
test_submodule_relative_url "(null)" "file:///tmp/repo" "../subrepo"
"file:///tmp/subrepo"
test_submodule_relative_url "(null)" "foo/bar" "../submodule" "foo/submodule"
-test_submodule_relative_url "../" "foo/bar" "../submodule" "../foo/submodule"
test_submodule_relative_url "(null)" "foo" "../submodule" "submodule"
-test_submodule_relative_url "../" "foo" "../submodule" "../submodule"
test_submodule_relative_url "(null)" "helper:://hostname/repo" "../subrepo"
"helper:://hostname/subrepo"
test_submodule_relative_url "(null)" "ssh://hostname/repo" "../subrepo"
"ssh://hostname/subrepo"
test_submodule_relative_url "(null)" "ssh://hostname:22/repo" "../subrepo"
"ssh://hostname:22/subrepo"
--
2.7.0.rc0.46.g8f16ed4.dirty
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html