| #include "clar_libgit2.h" |
| #include "../submodule/submodule_helpers.h" |
| #include "repository.h" |
| |
| void test_repo_reservedname__cleanup(void) |
| { |
| cl_git_sandbox_cleanup(); |
| } |
| |
| void test_repo_reservedname__includes_shortname_on_win32(void) |
| { |
| git_repository *repo; |
| git_buf *reserved; |
| size_t reserved_len; |
| |
| repo = cl_git_sandbox_init("nasty"); |
| cl_assert(git_repository__reserved_names(&reserved, &reserved_len, repo, false)); |
| |
| #ifdef GIT_WIN32 |
| cl_assert_equal_i(2, reserved_len); |
| cl_assert_equal_s(".git", reserved[0].ptr); |
| cl_assert_equal_s("GIT~1", reserved[1].ptr); |
| #else |
| cl_assert_equal_i(1, reserved_len); |
| cl_assert_equal_s(".git", reserved[0].ptr); |
| #endif |
| } |
| |
| void test_repo_reservedname__includes_shortname_when_requested(void) |
| { |
| git_repository *repo; |
| git_buf *reserved; |
| size_t reserved_len; |
| |
| repo = cl_git_sandbox_init("nasty"); |
| cl_assert(git_repository__reserved_names(&reserved, &reserved_len, repo, true)); |
| |
| cl_assert_equal_i(2, reserved_len); |
| cl_assert_equal_s(".git", reserved[0].ptr); |
| cl_assert_equal_s("GIT~1", reserved[1].ptr); |
| } |
| |
| /* Ensures that custom shortnames are included: creates a GIT~1 so that the |
| * .git folder itself will have to be named GIT~2 |
| */ |
| void test_repo_reservedname__custom_shortname_recognized(void) |
| { |
| #ifdef GIT_WIN32 |
| git_repository *repo; |
| git_buf *reserved; |
| size_t reserved_len; |
| |
| if (!cl_sandbox_supports_8dot3()) |
| clar__skip(); |
| |
| repo = cl_git_sandbox_init("nasty"); |
| |
| cl_must_pass(p_rename("nasty/.git", "nasty/_temp")); |
| cl_git_write2file("nasty/git~1", "", 0, O_RDWR|O_CREAT, 0666); |
| cl_must_pass(p_rename("nasty/_temp", "nasty/.git")); |
| |
| cl_assert(git_repository__reserved_names(&reserved, &reserved_len, repo, true)); |
| |
| cl_assert_equal_i(3, reserved_len); |
| cl_assert_equal_s(".git", reserved[0].ptr); |
| cl_assert_equal_s("GIT~1", reserved[1].ptr); |
| cl_assert_equal_s("GIT~2", reserved[2].ptr); |
| #endif |
| } |
| |
| /* When looking at the short name for a submodule, we need to prevent |
| * people from overwriting the `.git` file in the submodule working |
| * directory itself. We don't want to look at the actual repository |
| * path, since it will be in the super's repository above us, and |
| * typically named with the name of our subrepository. Consequently, |
| * preventing access to the short name of the actual repository path |
| * would prevent us from creating files with the same name as the |
| * subrepo. (Eg, a submodule named "libgit2" could not contain a file |
| * named "libgit2", which would be unfortunate.) |
| */ |
| void test_repo_reservedname__submodule_pointer(void) |
| { |
| #ifdef GIT_WIN32 |
| git_repository *super_repo, *sub_repo; |
| git_submodule *sub; |
| git_buf *sub_reserved; |
| size_t sub_reserved_len; |
| |
| if (!cl_sandbox_supports_8dot3()) |
| clar__skip(); |
| |
| super_repo = setup_fixture_submod2(); |
| |
| assert_submodule_exists(super_repo, "sm_unchanged"); |
| |
| cl_git_pass(git_submodule_lookup(&sub, super_repo, "sm_unchanged")); |
| cl_git_pass(git_submodule_open(&sub_repo, sub)); |
| |
| cl_assert(git_repository__reserved_names(&sub_reserved, &sub_reserved_len, sub_repo, true)); |
| |
| cl_assert_equal_i(2, sub_reserved_len); |
| cl_assert_equal_s(".git", sub_reserved[0].ptr); |
| cl_assert_equal_s("GIT~1", sub_reserved[1].ptr); |
| |
| git_submodule_free(sub); |
| git_repository_free(sub_repo); |
| #endif |
| } |
| |
| /* Like the `submodule_pointer` test (above), this ensures that we do not |
| * follow the gitlink to the submodule's repository location and treat that |
| * as a reserved name. This tests at an initial submodule update, where the |
| * submodule repo is being created. |
| */ |
| void test_repo_reservedname__submodule_pointer_during_create(void) |
| { |
| git_repository *repo; |
| git_submodule *sm; |
| git_submodule_update_options update_options = GIT_SUBMODULE_UPDATE_OPTIONS_INIT; |
| git_buf url = GIT_BUF_INIT; |
| |
| repo = setup_fixture_super(); |
| |
| cl_git_pass(git_buf_joinpath(&url, clar_sandbox_path(), "sub.git")); |
| cl_repo_set_string(repo, "submodule.sub.url", url.ptr); |
| |
| cl_git_pass(git_submodule_lookup(&sm, repo, "sub")); |
| cl_git_pass(git_submodule_update(sm, 1, &update_options)); |
| |
| git_submodule_free(sm); |
| git_buf_free(&url); |
| } |