submodule helper: convert relative URL to absolute URL if needed
PATCH 1/1 submodule helper: convert relative URL to absolute URL if needed
The submodule helper update_clone called by "git submodule update", clones submodules if needed. As submodules used to have the URL indicating if they were active, the step to resolve relative URLs was done in the "submodule init" step. Nowadays submodules can be configured active without calling an explicit init, e.g. via configuring submodule.active.
Then we'll fallback to the URL found in the .gitmodules, which may be relative to the superproject, but we do not resolve it, yet.
To do so, factor out the function that resolves the relative URLs in "git submodule init" (in the submodule helper in the init_submodule function) and cal it at the appropriate place in the update_clone helper.
--- builtin/submodule--helper.c | 48 ++++++++++++++++++++++++------------- t/t7400-submodule-basic.sh | 24 +++++++++++++++++++ 2 files changed, 55 insertions(+), 17 deletions(-)
builtin/submodule--helper.c +31 -17
@@ -584,6 +584,27 @@ static int module_foreach(int argc, const char **argv, const char *prefix)return 0 ; } + +char *compute_submodule_clone_url (const char *rel_url) +{ +char *remoteurl, *relurl; +char *remote =get_default_remote (); +struct strbuf remotesb =STRBUF_INIT ; + +strbuf_addf (&remotesb,"remote.%s.url" , remote); +free (remote); + +if (git_config_get_string (remotesb.buf, &remoteurl)) { +warning (_ ("could not lookup configuration '%s'. Assuming this repository is its own authoritative upstream." ), remotesb.buf); + remoteurl =xgetcwd (); + } + relurl =relative_url (remoteurl, rel_url,NULL ); +strbuf_release (&remotesb); +free (remoteurl); + +return relurl; +} +struct init_cb {const char *prefix;unsigned int flags;
@@ -634,21 +655,9 @@ static void init_submodule(const char *path, const char *prefix,/* Possibly a url relative to parent */ if (starts_with_dot_dot_slash (url) ||starts_with_dot_slash (url)) { -char *remoteurl, *relurl; -char *remote =get_default_remote (); -struct strbuf remotesb =STRBUF_INIT ; -strbuf_addf (&remotesb,"remote.%s.url" , remote); -free (remote); - -if (git_config_get_string (remotesb.buf, &remoteurl)) { -warning (_ ("could not lookup configuration '%s'. Assuming this repository is its own authoritative upstream." ), remotesb.buf); - remoteurl =xgetcwd (); - } - relurl =relative_url (remoteurl, url,NULL ); -strbuf_release (&remotesb); -free (remoteurl); -free (url); - url = relurl; +char *to_free = url; + url =compute_submodule_clone_url (url); +free (to_free); }if (git_config_set_gently (sb.buf, url))
@@ -1562,8 +1571,13 @@ static int prepare_to_clone_next_submodule(const struct cache_entry *ce,strbuf_reset (&sb);strbuf_addf (&sb,"submodule.%s.url" , sub->name); -if (repo_config_get_string_const (the_repository, sb.buf, &url)) - url = sub->url; +if (repo_config_get_string_const (the_repository, sb.buf, &url)) { +if (starts_with_dot_slash (sub->url) || +starts_with_dot_dot_slash (sub->url)) + url =compute_submodule_clone_url (sub->url); +else + url = sub->url; + }strbuf_reset (&sb);strbuf_addf (&sb,"%s/.git" , ce->name);
t/t7400-submodule-basic.sh +24 -0
@@ -1224,6 +1224,30 @@ test_expect_success 'submodule update and setting submodule.<name>.active' ' test_cmp expect actual ' +test_expect_success 'clone active submodule without submodule url set' ' + test_when_finished "rm -rf test/test" && + mkdir test && + # another dir breaks accidental relative paths still being correct + git clone file://"$pwd"/multisuper test/test && + ( + cd test/test && + git config submodule.active "." && + + # do not pass --init flag, as it is already active: + git submodule update && + git submodule status >actual_raw && + + cut -c 1,43- actual_raw >actual && + cat >expect <<-\EOF && + sub0 (test2) + sub1 (test2) + sub2 (test2) + sub3 (test2) + EOF + test_cmp expect actual + ) +' + test_expect_success 'clone --recurse-submodules with a pathspec works' ' test_when_finished "rm -rf multisuper_clone" && cat >expected <<-\EOF &&
Signature · 1 line
2.19.0
Hi,
Quoted 8 lines · Stefan Beller
The submodule helper
update_clonecalled by "git submodule update", clones submodules if needed. As submodules used to have the URL indicating if they were active, the step to resolve relative URLs was done in the "submodule init" step. Nowadays submodules can be configured active without calling an explicit init, e.g. via configuring submodule.active.Then we'll fallback to the URL found in the .gitmodules, which may be relative to the superproject, but we do not resolve it, yet.
Oh! Good catch.
Quoted 3 lines
To do so, factor out the function that resolves the relative URLs in "git submodule init" (in the submodule helper in the
init_submodulefunction) and cal it at the appropriate place in theupdate_clonehelper.
s/cal/call/
Quoted 5 lines
Signed-off-by Stefan Beller <[email protected]>--- builtin/submodule--helper.c | 48 ++++++++++++++++++++++++------------- t/t7400-submodule-basic.sh | 24 +++++++++++++++++++ 2 files changed, 55 insertions(+), 17 deletions(-)
What is the symptom when this fails?
builtin/submodule--helper.c static int module_foreach(int argc, const char **argv, const char *prefix) · line 588
Quoted 10 lines
builtin/submodule--helper.c +2
-0@@ -584,6 +584,27 @@ static int module_foreach(int argc, const char **argv, const char *prefix)return 0 ; } + +char *compute_submodule_clone_url (const char *rel_url)
Should be static.
Is the caller responsible for freeing the returned buffer?
builtin/submodule--helper.c static int module_foreach(int argc, const char **argv, const char *prefix) · line 592
Quoted 4 lines
builtin/submodule--helper.c +4
-0+{ +char *remoteurl, *relurl; +char *remote =get_default_remote (); +struct strbuf remotesb =STRBUF_INIT ;
optional: could rename, something like
struct strbuf key = STRBUF_INIT; remote = get_default_remote(); strbuf_addf(&key, "remote.%s.url", remote);
[...]
strbuf_release(&key); free(remote); return result;
builtin/submodule--helper.c static int module_foreach(int argc, const char **argv, const char *prefix) · line 598
Quoted 6 lines
builtin/submodule--helper.c +6
-0+ +strbuf_addf (&remotesb,"remote.%s.url" , remote); +free (remote); + +if (git_config_get_string (remotesb.buf, &remoteurl)) { +warning (_ ("could not lookup configuration '%s'. Assuming this repository is its own authoritative upstream." ), remotesb.buf);
nit: lookup is the noun, "look up" is the verb
Quoted 21 lines
builtin/submodule--helper.c +9
-5+ remoteurl =xgetcwd (); + } + relurl =relative_url (remoteurl, rel_url,NULL ); +strbuf_release (&remotesb); +free (remoteurl); + +return relurl; +} +struct init_cb {const char *prefix;unsigned int flags;@@ -634,21 +655,9 @@ static void init_submodule(const char *path, const char *prefix,/* Possibly a url relative to parent */ if (starts_with_dot_dot_slash (url) ||starts_with_dot_slash (url)) { -char *remoteurl, *relurl; -char *remote =get_default_remote (); -struct strbuf remotesb =STRBUF_INIT ; -strbuf_addf (&remotesb,"remote.%s.url" , remote); -free (remote);
builtin/submodule--helper.c static void init_submodule(const char *path, const char *prefix, · line 651
Quoted 10 lines
builtin/submodule--helper.c +0
-10- -if (git_config_get_string (remotesb.buf, &remoteurl)) { -warning (_ ("could not lookup configuration '%s'. Assuming this repository is its own authoritative upstream." ), remotesb.buf); - remoteurl =xgetcwd (); - } - relurl =relative_url (remoteurl, url,NULL ); -strbuf_release (&remotesb); -free (remoteurl); -free (url); - url = relurl;
Ah, this is moved code. I should have used --color-moved. ;-)
builtin/submodule--helper.c static void init_submodule(const char *path, const char *prefix, · line 660
Quoted 3 lines
builtin/submodule--helper.c +3
-0+char *to_free = url; + url =compute_submodule_clone_url (url); +free (to_free);
Maybe:
char *old_url = url; url = ...(old_url); free(old_url);
Quoted 6 lines
builtin/submodule--helper.c +0
-0}if (git_config_set_gently (sb.buf, url))@@ -1562,8 +1571,13 @@ static int prepare_to_clone_next_submodule(const struct cache_entry *ce,strbuf_reset (&sb);
builtin/submodule--helper.c static int prepare_to_clone_next_submodule(const struct cache_entry *ce, · line 1580
Quoted 10 lines
builtin/submodule--helper.c +7
-2strbuf_addf (&sb,"submodule.%s.url" , sub->name); -if (repo_config_get_string_const (the_repository, sb.buf, &url)) - url = sub->url; +if (repo_config_get_string_const (the_repository, sb.buf, &url)) { +if (starts_with_dot_slash (sub->url) || +starts_with_dot_dot_slash (sub->url)) + url =compute_submodule_clone_url (sub->url); +else + url = sub->url; + }
Nice.
t/t7400-submodule-basic.sh test_expect_success 'submodule update and setting submodule.<name>.active' ' · line 1227
Quoted 12 lines
builtin/submodule--helper.c +0
-0strbuf_reset (&sb);strbuf_addf (&sb,"%s/.git" , ce->name);t/t7400-submodule-basic.sh +1
-0@@ -1224,6 +1224,30 @@ test_expect_success 'submodule update and setting submodule.<name>.active' ' test_cmp expect actual ' +test_expect_success 'clone active submodule without submodule url set' '
Thanks for the test \o/.
t/t7400-submodule-basic.sh test_expect_success 'submodule update and setting submodule.<name>.active' ' · line 1236
Quoted 9 lines
t/t7400-submodule-basic.sh +9
-0+ test_when_finished "rm -rf test/test" && + mkdir test && + # another dir breaks accidental relative paths still being correct + git clone file://"$pwd"/multisuper test/test && + ( + cd test/test && + git config submodule.active "." && + + # do not pass --init flag, as it is already active:
What does "it" refer to here?
Quoted 7 lines
t/t7400-submodule-basic.sh +7
-0+ git submodule update && + git submodule status >actual_raw && + + cut -c 1,43- actual_raw >actual && + cat >expect <<-\EOF && + sub0 (test2) + sub1 (test2)
t/t7400-submodule-basic.sh test_expect_success 'submodule update and setting submodule.<name>.active' ' · line 1253
Quoted 10 lines
t/t7400-submodule-basic.sh +7
-0+ sub2 (test2) + sub3 (test2) + EOF + test_cmp expect actual + ) +' + test_expect_success 'clone --recurse-submodules with a pathspec works' ' test_when_finished "rm -rf multisuper_clone" && cat >expected <<-\EOF &&
Thanks for the quick fix.
Jonathan
PATCH 1/1 submodule helper: convert relative URL to absolute URL if needed
In reply to Stefan BellerThe submodule helper update_clone called by "git submodule update", clones submodules if needed. As submodules used to have the URL indicating if they were active, the step to resolve relative URLs was done in the "submodule init" step. Nowadays submodules can be configured active without calling an explicit init, e.g. via configuring submodule.active.
When trying to obtain submodules that are set active this way, we'll fallback to the URL found in the .gitmodules, which may be relative to the superproject, but we do not resolve it, yet:
git clone https://gerrit.googlesource.com/gerrit
cd gerrit && grep url .gitmodules
url = ../plugins/codemirror-editor
...
git config submodule.active .
git submodule update
fatal: repository '../plugins/codemirror-editor' does not exist
fatal: clone of '../plugins/codemirror-editor' into submodule path '/tmp/gerrit/plugins/codemirror-editor' failed Failed to clone 'plugins/codemirror-editor'. Retry scheduled
[...]
fatal: clone of '../plugins/codemirror-editor' into submodule path '/tmp/gerrit/plugins/codemirror-editor' failed Failed to clone 'plugins/codemirror-editor' a second time, aborting
[...]
To resolve the issue, factor out the function that resolves the relative URLs in "git submodule init" (in the submodule helper in the init_submodule function) and call it at the appropriate place in the update_clone helper.
---
Quoted 1 line · Jonathan
Ah, this is moved code. I should have used --color-moved. ;-)
Yes, any cleanup should go on top.
I extended the commit message and made sure not to leak memory.
When rerolling origin/xxx/sb-submodule-recursive-fetch-gets-the-tip-in-pu, there will be conflicts with this series, but I can work with that.
builtin/submodule--helper.c | 48 ++++++++++++++++++++++++------------- t/t7400-submodule-basic.sh | 24 +++++++++++++++++++ 2 files changed, 55 insertions(+), 17 deletions(-)
builtin/submodule--helper.c +31 -17
@@ -584,6 +584,27 @@ static int module_foreach(int argc, const char **argv, const char *prefix)return 0 ; } + +static char *compute_submodule_clone_url (const char *rel_url) +{ +char *remoteurl, *relurl; +char *remote =get_default_remote (); +struct strbuf remotesb =STRBUF_INIT ; + +strbuf_addf (&remotesb,"remote.%s.url" , remote); +free (remote); + +if (git_config_get_string (remotesb.buf, &remoteurl)) { +warning (_ ("could not lookup configuration '%s'. Assuming this repository is its own authoritative upstream." ), remotesb.buf); + remoteurl =xgetcwd (); + } + relurl =relative_url (remoteurl, rel_url,NULL ); +strbuf_release (&remotesb); +free (remoteurl); + +return relurl; +} +struct init_cb {const char *prefix;unsigned int flags;
@@ -634,21 +655,9 @@ static void init_submodule(const char *path, const char *prefix,/* Possibly a url relative to parent */ if (starts_with_dot_dot_slash (url) ||starts_with_dot_slash (url)) { -char *remoteurl, *relurl; -char *remote =get_default_remote (); -struct strbuf remotesb =STRBUF_INIT ; -strbuf_addf (&remotesb,"remote.%s.url" , remote); -free (remote); - -if (git_config_get_string (remotesb.buf, &remoteurl)) { -warning (_ ("could not lookup configuration '%s'. Assuming this repository is its own authoritative upstream." ), remotesb.buf); - remoteurl =xgetcwd (); - } - relurl =relative_url (remoteurl, url,NULL ); -strbuf_release (&remotesb); -free (remoteurl); -free (url); - url = relurl; +char *to_free = url; + url =compute_submodule_clone_url (url); +free (to_free); }if (git_config_set_gently (sb.buf, url))
@@ -1562,8 +1571,13 @@ static int prepare_to_clone_next_submodule(const struct cache_entry *ce,strbuf_reset (&sb);strbuf_addf (&sb,"submodule.%s.url" , sub->name); -if (repo_config_get_string_const (the_repository, sb.buf, &url)) - url = sub->url; +if (repo_config_get_string_const (the_repository, sb.buf, &url)) { +if (starts_with_dot_slash (sub->url) || +starts_with_dot_dot_slash (sub->url)) + url =compute_submodule_clone_url (sub->url); +else + url = sub->url; + }strbuf_reset (&sb);strbuf_addf (&sb,"%s/.git" , ce->name);
t/t7400-submodule-basic.sh +24 -0
@@ -1224,6 +1224,30 @@ test_expect_success 'submodule update and setting submodule.<name>.active' ' test_cmp expect actual ' +test_expect_success 'clone active submodule without submodule url set' ' + test_when_finished "rm -rf test/test" && + mkdir test && + # another dir breaks accidental relative paths still being correct + git clone file://"$pwd"/multisuper test/test && + ( + cd test/test && + git config submodule.active "." && + + # do not pass --init flag, as the submodule is already active: + git submodule update && + git submodule status >actual_raw && + + cut -c 1,43- actual_raw >actual && + cat >expect <<-\EOF && + sub0 (test2) + sub1 (test2) + sub2 (test2) + sub3 (test2) + EOF + test_cmp expect actual + ) +' + test_expect_success 'clone --recurse-submodules with a pathspec works' ' test_when_finished "rm -rf multisuper_clone" && cat >expected <<-\EOF &&
Signature · 1 line
2.19.0
Hi,
Quoted 10 lines · Stefan Beller
The submodule helper
update_clonecalled by "git submodule update", clones submodules if needed. As submodules used to have the URL indicating if they were active, the step to resolve relative URLs was done in the "submodule init" step. Nowadays submodules can be configured active without calling an explicit init, e.g. via configuring submodule.active.When trying to obtain submodules that are set active this way, we'll fallback to the URL found in the .gitmodules, which may be relative to the superproject, but we do not resolve it, yet:
Quoted 13 lines
git clone https://gerrit.googlesource.com/gerrit
cd gerrit && grep url .gitmodules
url = ../plugins/codemirror-editor
...
git config submodule.active .
git submodule update
fatal: repository '../plugins/codemirror-editor' does not exist
fatal: clone of '../plugins/codemirror-editor' into submodule path '/tmp/gerrit/plugins/codemirror-editor' failed Failed to clone 'plugins/codemirror-editor'. Retry scheduled
[...]
fatal: clone of '../plugins/codemirror-editor' into submodule path '/tmp/gerrit/plugins/codemirror-editor' failed Failed to clone 'plugins/codemirror-editor' a second time, aborting
[...]
Thanks.
"git log" and other tools have the ability to rewrap lines and will get confused by this transcript. Can you indent it to unconfuse them?
Quoted 1 line
Signed-off-by Stefan Beller <[email protected]>
Please also credit the bug reporter:
[...]
builtin/submodule--helper.c static int module_foreach(int argc, const char **argv, const char *prefix) · line 587
Quoted 7 lines
builtin/submodule--helper.c +1
-0@@ -584,6 +584,27 @@ static int module_foreach(int argc, const char **argv, const char *prefix)return 0 ; } +
nit: inconsistent vertical whitespace (extra blank line?)
Quoted 9 lines
builtin/submodule--helper.c +9
-0+static char *compute_submodule_clone_url (const char *rel_url) +{ +char *remoteurl, *relurl; +char *remote =get_default_remote (); +struct strbuf remotesb =STRBUF_INIT ; + +strbuf_addf (&remotesb,"remote.%s.url" , remote); +free (remote); +
builtin/submodule--helper.c static int module_foreach(int argc, const char **argv, const char *prefix) · line 606
Quoted 10 lines
builtin/submodule--helper.c +10
-0+if (git_config_get_string (remotesb.buf, &remoteurl)) { +warning (_ ("could not lookup configuration '%s'. Assuming this repository is its own authoritative upstream." ), remotesb.buf); + remoteurl =xgetcwd (); + } + relurl =relative_url (remoteurl, rel_url,NULL ); +strbuf_release (&remotesb); +free (remoteurl); + +return relurl; +}
I think this would be easier to read with all the release commands together:
... free(remote); free(remoteurl); strbuf_release(&remotesb); return relurl;
[...]
Quoted 1 line
builtin/submodule--helper.c +0
-0@@ -634,21 +655,9 @@ static void init_submodule(const char *path, const char *prefix,
[...]
builtin/submodule--helper.c static void init_submodule(const char *path, const char *prefix, · line 660
Quoted 8 lines
builtin/submodule--helper.c +3
-5- relurl =relative_url (remoteurl, url,NULL ); -strbuf_release (&remotesb); -free (remoteurl); -free (url); - url = relurl; +char *to_free = url; + url =compute_submodule_clone_url (url); +free (to_free);
I still think this would be easier to read with a style that makes the ownership passing clearer:
char *oldurl = url; url = compute_submodule_clone_url(oldurl); free(oldurl);
With whatever subset of the above tweaks makes sense,
Thanks.
Quoted 19 lines · Jonathan Nieder
Quoted 9 lines
git config submodule.active .
git submodule update
fatal: repository '../plugins/codemirror-editor' does not exist
fatal: clone of '../plugins/codemirror-editor' into submodule path '/tmp/gerrit/plugins/codemirror-editor' failed Failed to clone 'plugins/codemirror-editor'. Retry scheduled
[...]
fatal: clone of '../plugins/codemirror-editor' into submodule path '/tmp/gerrit/plugins/codemirror-editor' failed Failed to clone 'plugins/codemirror-editor' a second time, aborting
[...]Thanks.
"git log" and other tools have the ability to rewrap lines and will get confused by this transcript. Can you indent it to unconfuse them?
Quoted 1 line
Signed-off-by Stefan Beller <[email protected]>Please also credit the bug reporter:
Quoted 8 lines
Reported-by Jaewoong Jung <[email protected]>...
nit: inconsistent vertical whitespace (extra blank line?)
...
I think this would be easier to read with all the release commands together:
...
All good points.
PATCH 1/1 submodule helper: convert relative URL to absolute URL if needed
The submodule helper update_clone called by "git submodule update", clones submodules if needed. As submodules used to have the URL indicating if they were active, the step to resolve relative URLs was done in the "submodule init" step. Nowadays submodules can be configured active without calling an explicit init, e.g. via configuring submodule.active.
When trying to obtain submodules that are set active this way, we'll fallback to the URL found in the .gitmodules, which may be relative to the superproject, but we do not resolve it, yet:
git clone https://gerrit.googlesource.com/gerrit
cd gerrit && grep url .gitmodules
url = ../plugins/codemirror-editor
...
git config submodule.active .
git submodule update
fatal: repository '../plugins/codemirror-editor' does not exist
fatal: clone of '../plugins/codemirror-editor' into submodule path '/tmp/gerrit/plugins/codemirror-editor' failed Failed to clone 'plugins/codemirror-editor'. Retry scheduled
[...]
fatal: clone of '../plugins/codemirror-editor' into submodule path '/tmp/gerrit/plugins/codemirror-editor' failed Failed to clone 'plugins/codemirror-editor' a second time, aborting
[...]
To resolve the issue, factor out the function that resolves the relative URLs in "git submodule init" (in the submodule helper in the init_submodule function) and call it at the appropriate place in the update_clone helper.
--- builtin/submodule--helper.c | 51 ++++++++++++++++++++++++------------- t/t7400-submodule-basic.sh | 24 +++++++++++++++++ 2 files changed, 58 insertions(+), 17 deletions(-)
builtin/submodule--helper.c +34 -17
@@ -584,6 +584,26 @@ static int module_foreach(int argc, const char **argv, const char *prefix)return 0 ; } +static char *compute_submodule_clone_url (const char *rel_url) +{ +char *remoteurl, *relurl; +char *remote =get_default_remote (); +struct strbuf remotesb =STRBUF_INIT ; + +strbuf_addf (&remotesb,"remote.%s.url" , remote); +if (git_config_get_string (remotesb.buf, &remoteurl)) { +warning (_ ("could not look up configuration '%s'. Assuming this repository is its own authoritative upstream." ), remotesb.buf); + remoteurl =xgetcwd (); + } + relurl =relative_url (remoteurl, rel_url,NULL ); + +free (remote); +free (remoteurl); +strbuf_release (&remotesb); + +return relurl; +} +struct init_cb {const char *prefix;unsigned int flags;
@@ -634,21 +654,9 @@ static void init_submodule(const char *path, const char *prefix,/* Possibly a url relative to parent */ if (starts_with_dot_dot_slash (url) ||starts_with_dot_slash (url)) { -char *remoteurl, *relurl; -char *remote =get_default_remote (); -struct strbuf remotesb =STRBUF_INIT ; -strbuf_addf (&remotesb,"remote.%s.url" , remote); -free (remote); - -if (git_config_get_string (remotesb.buf, &remoteurl)) { -warning (_ ("could not lookup configuration '%s'. Assuming this repository is its own authoritative upstream." ), remotesb.buf); - remoteurl =xgetcwd (); - } - relurl =relative_url (remoteurl, url,NULL ); -strbuf_release (&remotesb); -free (remoteurl); -free (url); - url = relurl; +char *oldurl = url; + url =compute_submodule_clone_url (oldurl); +free (oldurl); }if (git_config_set_gently (sb.buf, url))
@@ -1514,6 +1522,7 @@ static int prepare_to_clone_next_submodule(const struct cache_entry *ce,struct strbuf sb =STRBUF_INIT ;const char *displaypath =NULL ;int needs_cloning =0 ; +int need_free_url =0 ;if (ce_stage (ce)) {if (suc->recursive_prefix)
@@ -1562,8 +1571,14 @@ static int prepare_to_clone_next_submodule(const struct cache_entry *ce,strbuf_reset (&sb);strbuf_addf (&sb,"submodule.%s.url" , sub->name); -if (repo_config_get_string_const (the_repository, sb.buf, &url)) - url = sub->url; +if (repo_config_get_string_const (the_repository, sb.buf, &url)) { +if (starts_with_dot_slash (sub->url) || +starts_with_dot_dot_slash (sub->url)) { + url =compute_submodule_clone_url (sub->url); + need_free_url =1 ; + }else + url = sub->url; + }strbuf_reset (&sb);strbuf_addf (&sb,"%s/.git" , ce->name);
@@ -1608,6 +1623,8 @@ static int prepare_to_clone_next_submodule(const struct cache_entry *ce, cleanup:strbuf_reset (&displaypath_sb);strbuf_reset (&sb); +if (need_free_url) +free ((void *)url);return needs_cloning; }
t/t7400-submodule-basic.sh +24 -0
@@ -1224,6 +1224,30 @@ test_expect_success 'submodule update and setting submodule.<name>.active' ' test_cmp expect actual ' +test_expect_success 'clone active submodule without submodule url set' ' + test_when_finished "rm -rf test/test" && + mkdir test && + # another dir breaks accidental relative paths still being correct + git clone file://"$pwd"/multisuper test/test && + ( + cd test/test && + git config submodule.active "." && + + # do not pass --init flag, as the submodule is already active: + git submodule update && + git submodule status >actual_raw && + + cut -c 1,43- actual_raw >actual && + cat >expect <<-\EOF && + sub0 (test2) + sub1 (test2) + sub2 (test2) + sub3 (test2) + EOF + test_cmp expect actual + ) +' + test_expect_success 'clone --recurse-submodules with a pathspec works' ' test_when_finished "rm -rf multisuper_clone" && cat >expected <<-\EOF &&
Signature · 1 line
2.19.0
Quoted 6 lines · Stefan Beller
Reported-by Jaewoong Jung <[email protected]>Signed-off-by Stefan Beller <[email protected]>--- builtin/submodule--helper.c | 51 ++++++++++++++++++++++++------------- t/t7400-submodule-basic.sh | 24 +++++++++++++++++ 2 files changed, 58 insertions(+), 17 deletions(-)
Thanks for your patient work.