submodule: refuse lookup in bare repositories

While it is technically possible to look up submodules inside of a
bare repository by reading the submodule configuration of a specific
commit, we do not offer this functionality right now. As such, calling
both `git_submodule_lookup` and `git_submodule_foreach` should error out
early when these functions encounter a bare repository. While
`git_submodule_lookup` already does return an error due to not being
able to parse the configuration, `git_submodule_foreach` simply returns
success and never invokes the callback function.

Fix the issue by having both functions check whether the repository is
bare and returning an error in that case.
This commit is contained in:
Patrick Steinhardt
2017-07-10 12:25:43 +02:00
parent a889c05f2a
commit 477b3e0474
14 changed files with 49 additions and 0 deletions

View File

@@ -209,6 +209,11 @@ int git_submodule_lookup(
assert(repo && name);
if (repo->is_bare) {
giterr_set(GITERR_SUBMODULE, "cannot get submodules without a working tree");
return -1;
}
if (repo->submodule_cache != NULL) {
khiter_t pos = git_strmap_lookup_index(repo->submodule_cache, name);
if (git_strmap_valid_index(repo->submodule_cache, pos)) {
@@ -549,6 +554,11 @@ int git_submodule_foreach(
int error;
size_t i;
if (repo->is_bare) {
giterr_set(GITERR_SUBMODULE, "cannot get submodules without a working tree");
return -1;
}
if ((error = git_strmap_alloc(&submodules)) < 0)
return error;

View File

@@ -0,0 +1 @@
ref: refs/heads/master

View File

@@ -0,0 +1,4 @@
[core]
repositoryformatversion = 0
filemode = true
bare = true

View File

@@ -0,0 +1,2 @@
x%‰=
€0 F]í)Š0à"ÃIŒ*•|Éý-t{?œ2ÇilV8¿ùô$±«Øm¡ýv»ãk­k*F DAÊ=(=|=6<> ¬DAv=ÛÍA}™&'…Oò$=

View File

@@ -0,0 +1,3 @@
xќЋ[
В0О*fК¤S“ €€KР¤йЌъђ4ЭїwаЧ…Г9pУ2MCҐFфP @ќгЬu.„.¶pЪ!ІOYбѓdiYUН'М•8XпbPnјфК6
Д§Фћ“¶1[qоМ}0q«пҐРc[WЊ#Э1fєДR:ацSZ¦+YЖ+{µtdПlvє¬»юOmћЁu<D081>_ґ}и5Фiй·«щ` Kж

View File

@@ -0,0 +1,2 @@
P pack-b69d04bb39ac274669e2184e45bd90015d02ef5b.pack

View File

@@ -0,0 +1 @@
97896810b3210244a62a82458b8e0819ecfc6850

View File

@@ -419,3 +419,29 @@ void test_submodule_lookup__cached(void)
git_submodule_free(sm);
git_submodule_free(sm2);
}
void test_submodule_lookup__lookup_in_bare_repository_fails(void)
{
git_submodule *sm;
cl_git_sandbox_cleanup();
g_repo = cl_git_sandbox_init("submodules.git");
cl_git_fail(git_submodule_lookup(&sm, g_repo, "nonexisting"));
}
static int foreach_cb(git_submodule *sm, const char *name, void *payload)
{
GIT_UNUSED(sm);
GIT_UNUSED(name);
GIT_UNUSED(payload);
return 0;
}
void test_submodule_lookup__foreach_in_bare_repository_fails(void)
{
cl_git_sandbox_cleanup();
g_repo = cl_git_sandbox_init("submodules.git");
cl_git_fail(git_submodule_foreach(g_repo, foreach_cb, NULL));
}