Commit 6bb35878 by Alexander Ovchinnikov

clone: set refs/remotes/origin/HEAD to default branch when branch is specified, attempt 2

parent 8643b524
...@@ -259,30 +259,38 @@ cleanup: ...@@ -259,30 +259,38 @@ cleanup:
static int update_head_to_branch( static int update_head_to_branch(
git_repository *repo, git_repository *repo,
const char *remote_name, git_remote *remote,
const char *branch, const char *branch,
const char *reflog_message) const char *reflog_message)
{ {
int retcode; int retcode;
git_buf remote_branch_name = GIT_BUF_INIT; git_buf remote_branch_name = GIT_BUF_INIT;
git_reference* remote_ref = NULL; git_reference* remote_ref = NULL;
git_buf default_branch = GIT_BUF_INIT;
GIT_ASSERT_ARG(remote_name); GIT_ASSERT_ARG(remote);
GIT_ASSERT_ARG(branch); GIT_ASSERT_ARG(branch);
if ((retcode = git_buf_printf(&remote_branch_name, GIT_REFS_REMOTES_DIR "%s/%s", if ((retcode = git_buf_printf(&remote_branch_name, GIT_REFS_REMOTES_DIR "%s/%s",
remote_name, branch)) < 0 ) git_remote_name(remote), branch)) < 0 )
goto cleanup; goto cleanup;
if ((retcode = git_reference_lookup(&remote_ref, repo, git_buf_cstr(&remote_branch_name))) < 0) if ((retcode = git_reference_lookup(&remote_ref, repo, git_buf_cstr(&remote_branch_name))) < 0)
goto cleanup; goto cleanup;
retcode = update_head_to_new_branch(repo, git_reference_target(remote_ref), branch, if ((retcode = update_head_to_new_branch(repo, git_reference_target(remote_ref), branch,
reflog_message); reflog_message)) < 0)
goto cleanup;
if ((retcode = git_remote_default_branch(&default_branch, remote)) < 0)
goto cleanup;
retcode = update_remote_head(repo, remote, &default_branch, reflog_message);
cleanup: cleanup:
git_reference_free(remote_ref); git_reference_free(remote_ref);
git_buf_dispose(&remote_branch_name); git_buf_dispose(&remote_branch_name);
git_buf_dispose(&default_branch);
return retcode; return retcode;
} }
...@@ -367,8 +375,7 @@ static int checkout_branch(git_repository *repo, git_remote *remote, const git_c ...@@ -367,8 +375,7 @@ static int checkout_branch(git_repository *repo, git_remote *remote, const git_c
int error; int error;
if (branch) if (branch)
error = update_head_to_branch(repo, git_remote_name(remote), branch, error = update_head_to_branch(repo, remote, branch, reflog_message);
reflog_message);
/* Point HEAD to the same ref as the remote's head */ /* Point HEAD to the same ref as the remote's head */
else else
error = update_head_to_remote(repo, remote, reflog_message); error = update_head_to_remote(repo, remote, reflog_message);
......
...@@ -158,6 +158,8 @@ void test_clone_nonetwork__can_prevent_the_checkout_of_a_standard_repo(void) ...@@ -158,6 +158,8 @@ void test_clone_nonetwork__can_prevent_the_checkout_of_a_standard_repo(void)
void test_clone_nonetwork__can_checkout_given_branch(void) void test_clone_nonetwork__can_checkout_given_branch(void)
{ {
git_reference *remote_head;
g_options.checkout_branch = "test"; g_options.checkout_branch = "test";
cl_git_pass(git_clone(&g_repo, cl_git_fixture_url("testrepo.git"), "./foo", &g_options)); cl_git_pass(git_clone(&g_repo, cl_git_fixture_url("testrepo.git"), "./foo", &g_options));
...@@ -167,6 +169,12 @@ void test_clone_nonetwork__can_checkout_given_branch(void) ...@@ -167,6 +169,12 @@ void test_clone_nonetwork__can_checkout_given_branch(void)
cl_assert_equal_s(git_reference_name(g_ref), "refs/heads/test"); cl_assert_equal_s(git_reference_name(g_ref), "refs/heads/test");
cl_assert(git_path_exists("foo/readme.txt")); cl_assert(git_path_exists("foo/readme.txt"));
cl_git_pass(git_reference_lookup(&remote_head, g_repo, "refs/remotes/origin/HEAD"));
cl_assert_equal_i(GIT_REFERENCE_SYMBOLIC, git_reference_type(remote_head));
cl_assert_equal_s("refs/remotes/origin/master", git_reference_symbolic_target(remote_head));
git_reference_free(remote_head);
} }
static int clone_cancel_fetch_transfer_progress_cb( static int clone_cancel_fetch_transfer_progress_cb(
......
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