diff options
author | Vicent Marti <vicent@github.com> | 2014-03-27 08:32:46 +0100 |
---|---|---|
committer | Vicent Marti <vicent@github.com> | 2014-03-27 08:32:46 +0100 |
commit | 041fad4aac106650f00b7c445675f1c4bb8cfd53 (patch) | |
tree | 502536aa9a7480ed542f6d9d2f4bd6adc71bef82 /tests | |
parent | f4afcaa0d50bece4a784ce680d92e5c0d1c67785 (diff) | |
parent | 380f864a10aeadd30bd88138906d4fab577221de (diff) | |
download | libgit2-041fad4aac106650f00b7c445675f1c4bb8cfd53.tar.gz |
Merge pull request #2210 from libgit2/rb/submodule-api-with-no-submodules
Fix segfault if gitmodules is invalid
Diffstat (limited to 'tests')
-rw-r--r-- | tests/submodule/lookup.c | 33 | ||||
-rw-r--r-- | tests/submodule/nosubs.c | 95 |
2 files changed, 128 insertions, 0 deletions
diff --git a/tests/submodule/lookup.c b/tests/submodule/lookup.c index cc29b11b2..36bde4f6e 100644 --- a/tests/submodule/lookup.c +++ b/tests/submodule/lookup.c @@ -141,3 +141,36 @@ void test_submodule_lookup__lookup_even_with_missing_index(void) refute_submodule_exists(g_repo, "just_a_file", GIT_ENOTFOUND); refute_submodule_exists(g_repo, "no_such_file", GIT_ENOTFOUND); } + +void test_submodule_lookup__just_added(void) +{ + git_submodule *sm; + + cl_git_pass(git_submodule_add_setup(&sm, g_repo, "https://github.com/libgit2/libgit2.git", "sm_just_added", 1)); + git_submodule_free(sm); + assert_submodule_exists(g_repo, "sm_just_added"); + + cl_git_pass(git_submodule_add_setup(&sm, g_repo, "https://github.com/libgit2/libgit2.git", "sm_just_added_2", 1)); + assert_submodule_exists(g_repo, "sm_just_added_2"); + git_submodule_free(sm); + + cl_git_append2file("submod2/.gitmodules", "\n[submodule \"mismatch_name\"]\n\tpath = mismatch_path\n\turl = https://example.com/example.git\n\n"); + + cl_git_pass(git_submodule_reload_all(g_repo, 1)); + + assert_submodule_exists(g_repo, "mismatch_name"); + assert_submodule_exists(g_repo, "mismatch_path"); + + assert_submodule_exists(g_repo, "sm_just_added"); + assert_submodule_exists(g_repo, "sm_just_added_2"); + + /* all the regular ones should still be working right, too */ + + assert_submodule_exists(g_repo, "sm_unchanged"); + assert_submodule_exists(g_repo, "sm_added_and_uncommited"); + assert_submodule_exists(g_repo, "sm_gitmodules_only"); + refute_submodule_exists(g_repo, "not-submodule", GIT_EEXISTS); + refute_submodule_exists(g_repo, "just_a_dir", GIT_ENOTFOUND); + refute_submodule_exists(g_repo, "just_a_file", GIT_ENOTFOUND); + refute_submodule_exists(g_repo, "no_such_file", GIT_ENOTFOUND); +} diff --git a/tests/submodule/nosubs.c b/tests/submodule/nosubs.c new file mode 100644 index 000000000..5ef4f42ab --- /dev/null +++ b/tests/submodule/nosubs.c @@ -0,0 +1,95 @@ +/* test the submodule APIs on repositories where there are no submodules */ + +#include "clar_libgit2.h" +#include "posix.h" + +void test_submodule_nosubs__cleanup(void) +{ + cl_git_sandbox_cleanup(); +} + +void test_submodule_nosubs__lookup(void) +{ + git_repository *repo = cl_git_sandbox_init("status"); + git_submodule *sm = NULL; + + p_mkdir("status/subrepo", 0777); + cl_git_mkfile("status/subrepo/.git", "gitdir: ../.git"); + + cl_assert_equal_i(GIT_ENOTFOUND, git_submodule_lookup(&sm, repo, "subdir")); + + cl_assert_equal_i(GIT_EEXISTS, git_submodule_lookup(&sm, repo, "subrepo")); + + cl_git_pass(git_submodule_reload_all(repo, 0)); + + cl_assert_equal_i(GIT_ENOTFOUND, git_submodule_lookup(&sm, repo, "subdir")); + + cl_assert_equal_i(GIT_EEXISTS, git_submodule_lookup(&sm, repo, "subrepo")); +} + +void test_submodule_nosubs__immediate_reload(void) +{ + git_repository *repo = cl_git_sandbox_init("status"); + cl_git_pass(git_submodule_reload_all(repo, 0)); +} + +static int fake_submod_cb(git_submodule *sm, const char *n, void *p) +{ + GIT_UNUSED(sm); GIT_UNUSED(n); GIT_UNUSED(p); + return 0; +} + +void test_submodule_nosubs__foreach(void) +{ + git_repository *repo = cl_git_sandbox_init("status"); + cl_git_pass(git_submodule_foreach(repo, fake_submod_cb, NULL)); +} + +void test_submodule_nosubs__add(void) +{ + git_repository *repo = cl_git_sandbox_init("status"); + git_submodule *sm, *sm2; + + cl_git_pass(git_submodule_add_setup(&sm, repo, "https://github.com/libgit2/libgit2.git", "submodules/libgit2", 1)); + + cl_git_pass(git_submodule_lookup(&sm2, repo, "submodules/libgit2")); + git_submodule_free(sm2); + + cl_git_pass(git_submodule_foreach(repo, fake_submod_cb, NULL)); + cl_git_pass(git_submodule_reload_all(repo, 0)); + + git_submodule_free(sm); +} + +void test_submodule_nosubs__reload_add_reload(void) +{ + git_repository *repo = cl_git_sandbox_init("status"); + git_submodule *sm; + + cl_git_pass(git_submodule_reload_all(repo, 0)); + + cl_git_pass(git_submodule_add_setup(&sm, repo, "https://github.com/libgit2/libgit2.git", "submodules/libgit2", 1)); + + cl_git_pass(git_submodule_reload_all(repo, 0)); + + cl_assert_equal_s("submodules/libgit2", git_submodule_name(sm)); + git_submodule_free(sm); + + cl_git_pass(git_submodule_lookup(&sm, repo, "submodules/libgit2")); + cl_assert_equal_s("submodules/libgit2", git_submodule_name(sm)); + git_submodule_free(sm); +} + +void test_submodule_nosubs__bad_gitmodules(void) +{ + git_repository *repo = cl_git_sandbox_init("status"); + + cl_git_mkfile("status/.gitmodules", "[submodule \"foobar\"]\tpath=blargle\n\turl=\n\tbranch=\n\tupdate=flooble\n\n"); + cl_git_fail(git_submodule_reload_all(repo, 0)); + + cl_git_rewritefile("status/.gitmodules", "[submodule \"foobar\"]\tpath=blargle\n\turl=\n\tbranch=\n\tupdate=rebase\n\n"); + cl_git_pass(git_submodule_reload_all(repo, 0)); + + cl_git_pass(git_submodule_lookup(NULL, repo, "foobar")); + cl_assert_equal_i(GIT_ENOTFOUND, git_submodule_lookup(NULL, repo, "subdir")); +} |