Commit 4d968f13 by nulltoken

clone: Explicit support of no-checkout option

parent 1ddc537c
...@@ -29,9 +29,12 @@ GIT_BEGIN_DECL ...@@ -29,9 +29,12 @@ GIT_BEGIN_DECL
* @param out pointer that will receive the resulting repository object * @param out pointer that will receive the resulting repository object
* @param origin_url repository to clone from * @param origin_url repository to clone from
* @param workdir_path local directory to clone to * @param workdir_path local directory to clone to
* @param fetch_stats pointer to structure that receives fetch progress information (may be NULL) * @param fetch_stats pointer to structure that receives fetch progress
* @param checkout_opts options for the checkout step (may be NULL) * information (may be NULL)
* @return 0 on success, GIT_ERROR otherwise (use giterr_last for information about the error) * @param checkout_opts options for the checkout step. If NULL, no checkout
* is performed
* @return 0 on success, GIT_ERROR otherwise (use giterr_last for information
* about the error)
*/ */
GIT_EXTERN(int) git_clone(git_repository **out, GIT_EXTERN(int) git_clone(git_repository **out,
const char *origin_url, const char *origin_url,
......
...@@ -290,6 +290,19 @@ static bool path_is_okay(const char *path) ...@@ -290,6 +290,19 @@ static bool path_is_okay(const char *path)
return true; return true;
} }
static bool should_checkout(
git_repository *repo,
bool is_bare,
git_checkout_opts *opts)
{
if (is_bare)
return false;
if (!opts)
return false;
return !git_repository_head_orphan(repo);
}
static int clone_internal( static int clone_internal(
git_repository **out, git_repository **out,
...@@ -298,7 +311,7 @@ static int clone_internal( ...@@ -298,7 +311,7 @@ static int clone_internal(
git_indexer_stats *fetch_stats, git_indexer_stats *fetch_stats,
git_indexer_stats *checkout_stats, git_indexer_stats *checkout_stats,
git_checkout_opts *checkout_opts, git_checkout_opts *checkout_opts,
int is_bare) bool is_bare)
{ {
int retcode = GIT_ERROR; int retcode = GIT_ERROR;
git_repository *repo = NULL; git_repository *repo = NULL;
...@@ -321,7 +334,7 @@ static int clone_internal( ...@@ -321,7 +334,7 @@ static int clone_internal(
} }
} }
if (!retcode && !is_bare && !git_repository_head_orphan(repo)) if (!retcode && should_checkout(repo, is_bare, checkout_opts))
retcode = git_checkout_head(*out, checkout_opts, checkout_stats); retcode = git_checkout_head(*out, checkout_opts, checkout_stats);
return retcode; return retcode;
......
...@@ -72,3 +72,31 @@ void test_clone_network__empty_repository(void) ...@@ -72,3 +72,31 @@ void test_clone_network__empty_repository(void)
git_reference_free(head); git_reference_free(head);
} }
void test_clone_network__can_prevent_the_checkout_of_a_standard_repo(void)
{
git_buf path = GIT_BUF_INIT;
cl_set_cleanup(&cleanup_repository, "./no-checkout");
cl_git_pass(git_clone(&g_repo, LIVE_REPO_URL, "./no-checkout", NULL, NULL, NULL));
cl_git_pass(git_buf_joinpath(&path, git_repository_workdir(g_repo), "master.txt"));
cl_assert_equal_i(false, git_path_isfile(git_buf_cstr(&path)));
}
void test_clone_network__can_checkout_a_cloned_repo(void)
{
git_checkout_opts opts;
git_buf path = GIT_BUF_INIT;
memset(&opts, 0, sizeof(opts));
opts.checkout_strategy = GIT_CHECKOUT_CREATE_MISSING;
cl_set_cleanup(&cleanup_repository, "./default-checkout");
cl_git_pass(git_clone(&g_repo, LIVE_REPO_URL, "./default-checkout", NULL, NULL, &opts));
cl_git_pass(git_buf_joinpath(&path, git_repository_workdir(g_repo), "master.txt"));
cl_assert_equal_i(true, git_path_isfile(git_buf_cstr(&path)));
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment