From 466d2e7a5f0e3b481fc5e77130f1e77f20f100ec Mon Sep 17 00:00:00 2001 From: Linquize Date: Fri, 3 Apr 2015 19:01:20 +0800 Subject: For bare repository, use repo_dir to test if symlinks are supported --- src/repository.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/repository.c b/src/repository.c index 6a80070d1..cf9c7d194 100644 --- a/src/repository.c +++ b/src/repository.c @@ -1606,6 +1606,7 @@ int git_repository_init_ext( { int error; git_buf repo_path = GIT_BUF_INIT, wd_path = GIT_BUF_INIT; + const char *wd; assert(out && given_repo && opts); @@ -1615,6 +1616,7 @@ int git_repository_init_ext( if (error < 0) goto cleanup; + wd = (opts->flags & GIT_REPOSITORY_INIT_BARE) ? NULL : git_buf_cstr(&wd_path); if (valid_repository_path(&repo_path)) { if ((opts->flags & GIT_REPOSITORY_INIT_NO_REINIT) != 0) { @@ -1627,15 +1629,15 @@ int git_repository_init_ext( opts->flags |= GIT_REPOSITORY_INIT__IS_REINIT; error = repo_init_config( - repo_path.ptr, wd_path.ptr, opts->flags, opts->mode); + repo_path.ptr, wd, opts->flags, opts->mode); /* TODO: reinitialize the templates */ } else { if (!(error = repo_init_structure( - repo_path.ptr, wd_path.ptr, opts)) && + repo_path.ptr, wd, opts)) && !(error = repo_init_config( - repo_path.ptr, wd_path.ptr, opts->flags, opts->mode))) + repo_path.ptr, wd, opts->flags, opts->mode))) error = repo_init_create_head( repo_path.ptr, opts->initial_head); } -- cgit v1.2.1 From 7c2a2172b85873c67f989ab55e0bde6ff83d8c38 Mon Sep 17 00:00:00 2001 From: Linquize Date: Sat, 4 Apr 2015 00:29:01 +0800 Subject: Test: Create repo in while current dir is readonly and checkout symlink --- tests/checkout/index.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/tests/checkout/index.c b/tests/checkout/index.c index 63ed4b177..b759db206 100644 --- a/tests/checkout/index.c +++ b/tests/checkout/index.c @@ -4,6 +4,7 @@ #include "git2/checkout.h" #include "fileops.h" #include "repository.h" +#include "remote.h" static git_repository *g_repo; @@ -135,6 +136,52 @@ void test_checkout_index__honor_coreautocrlf_setting_set_to_true(void) #endif } +void test_checkout_index__honor_coresymlinks_default(void) +{ + git_repository *repo; + git_remote *origin; + git_object *target; + char cwd[GIT_PATH_MAX]; + + const char *url = git_repository_path(g_repo); + + getcwd(cwd, sizeof(cwd)); + cl_assert_equal_i(0, p_mkdir("readonly", 0555)); // Read-only directory + cl_assert_equal_i(0, chdir("readonly")); + cl_git_pass(git_repository_init(&repo, "../symlink.git", true)); + cl_assert_equal_i(0, chdir(cwd)); + cl_assert_equal_i(0, p_mkdir("symlink", 0777)); + cl_git_pass(git_repository_set_workdir(repo, "symlink", 1)); + + cl_git_pass(git_remote_create(&origin, repo, GIT_REMOTE_ORIGIN, url)); + cl_git_pass(git_remote_connect(origin, GIT_DIRECTION_FETCH)); + cl_git_pass(git_remote_download(origin, NULL)); + cl_git_pass(git_remote_update_tips(origin, NULL)); + git_remote_free(origin); + + cl_git_pass(git_revparse_single(&target, repo, "remotes/origin/master")); + cl_git_pass(git_reset(repo, target, GIT_RESET_HARD, NULL)); + git_object_free(target); + git_repository_free(repo); + +#ifdef GIT_WIN32 + check_file_contents("./symlink/link_to_new.txt", "new.txt"); +#else + { + char link_data[1024]; + size_t link_size = 1024; + + link_size = p_readlink("./symlink/link_to_new.txt", link_data, link_size); + link_data[link_size] = '\0'; + cl_assert_equal_i(link_size, strlen("new.txt")); + cl_assert_equal_s(link_data, "new.txt"); + check_file_contents("./symlink/link_to_new.txt", "my new file\n"); + } +#endif + + cl_fixture_cleanup("symlink"); +} + void test_checkout_index__honor_coresymlinks_setting_set_to_true(void) { git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; -- cgit v1.2.1