Merge pull request #6010 from A-Ovchinnikov-mx/a-ovchin/remote-head-branch-clone Set refs/remotes/origin/HEAD to default branch when branch is specified
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
diff --git a/src/clone.c b/src/clone.c
index 6d5ebf6..e29a4aa 100644
--- a/src/clone.c
+++ b/src/clone.c
@@ -162,37 +162,6 @@ done:
return error;
}
-static int update_remote_head_byname(
- git_repository *repo,
- const char *remote_name,
- const char *tracking_branch_name,
- const char *reflog_message)
-{
- git_buf tracking_head_name = GIT_BUF_INIT;
- git_reference *remote_head = NULL;
- int error;
-
- if ((error = git_buf_printf(&tracking_head_name,
- "%s%s/%s",
- GIT_REFS_REMOTES_DIR,
- remote_name,
- GIT_HEAD_FILE)) < 0)
- goto cleanup;
-
- error = git_reference_symbolic_create(
- &remote_head,
- repo,
- git_buf_cstr(&tracking_head_name),
- tracking_branch_name,
- true,
- reflog_message);
-
-cleanup:
- git_reference_free(remote_head);
- git_buf_dispose(&tracking_head_name);
- return error;
-}
-
static int update_remote_head(
git_repository *repo,
git_remote *remote,
@@ -200,7 +169,9 @@ static int update_remote_head(
const char *reflog_message)
{
git_refspec *refspec;
- git_buf tracking_branch_name = GIT_BUF_INIT;
+ git_reference *remote_head = NULL;
+ git_buf remote_head_name = GIT_BUF_INIT;
+ git_buf remote_branch_name = GIT_BUF_INIT;
int error;
/* Determine the remote tracking ref name from the local branch */
@@ -213,19 +184,30 @@ static int update_remote_head(
}
if ((error = git_refspec_transform(
- &tracking_branch_name,
+ &remote_branch_name,
refspec,
git_buf_cstr(target))) < 0)
goto cleanup;
- error = update_remote_head_byname(
- repo,
+ if ((error = git_buf_printf(&remote_head_name,
+ "%s%s/%s",
+ GIT_REFS_REMOTES_DIR,
git_remote_name(remote),
- git_buf_cstr(&tracking_branch_name),
+ GIT_HEAD_FILE)) < 0)
+ goto cleanup;
+
+ error = git_reference_symbolic_create(
+ &remote_head,
+ repo,
+ git_buf_cstr(&remote_head_name),
+ git_buf_cstr(&remote_branch_name),
+ true,
reflog_message);
cleanup:
- git_buf_dispose(&tracking_branch_name);
+ git_reference_free(remote_head);
+ git_buf_dispose(&remote_branch_name);
+ git_buf_dispose(&remote_head_name);
return error;
}
@@ -277,19 +259,20 @@ cleanup:
static int update_head_to_branch(
git_repository *repo,
- const char *remote_name,
+ git_remote *remote,
const char *branch,
const char *reflog_message)
{
int retcode;
git_buf remote_branch_name = GIT_BUF_INIT;
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);
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;
if ((retcode = git_reference_lookup(&remote_ref, repo, git_buf_cstr(&remote_branch_name))) < 0)
@@ -299,11 +282,18 @@ static int update_head_to_branch(
reflog_message)) < 0)
goto cleanup;
- retcode = update_remote_head_byname(repo, remote_name, remote_branch_name.ptr, reflog_message);
+ if ((retcode = git_remote_default_branch(&default_branch, remote)) < 0)
+ goto cleanup;
+
+ if (!git_remote__matching_refspec(remote, git_buf_cstr(&default_branch)))
+ goto cleanup;
+
+ retcode = update_remote_head(repo, remote, &default_branch, reflog_message);
cleanup:
git_reference_free(remote_ref);
git_buf_dispose(&remote_branch_name);
+ git_buf_dispose(&default_branch);
return retcode;
}
@@ -388,8 +378,7 @@ static int checkout_branch(git_repository *repo, git_remote *remote, const git_c
int error;
if (branch)
- error = update_head_to_branch(repo, git_remote_name(remote), branch,
- reflog_message);
+ error = update_head_to_branch(repo, remote, branch, reflog_message);
/* Point HEAD to the same ref as the remote's head */
else
error = update_head_to_remote(repo, remote, reflog_message);
diff --git a/tests/clone/nonetwork.c b/tests/clone/nonetwork.c
index d4da3d3..ec12fee 100644
--- a/tests/clone/nonetwork.c
+++ b/tests/clone/nonetwork.c
@@ -172,7 +172,7 @@ void test_clone_nonetwork__can_checkout_given_branch(void)
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/test", git_reference_symbolic_target(remote_head));
+ cl_assert_equal_s("refs/remotes/origin/master", git_reference_symbolic_target(remote_head));
git_reference_free(remote_head);
}