Skip to content

Commit 3f8bf8b

Browse files
authored
Merge pull request libgit2#6010 from A-Ovchinnikov-mx/a-ovchin/remote-head-branch-clone
Set refs/remotes/origin/HEAD to default branch when branch is specified
2 parents fabacb7 + cb078d5 commit 3f8bf8b

File tree

2 files changed

+33
-44
lines changed

2 files changed

+33
-44
lines changed

src/clone.c

Lines changed: 32 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -162,45 +162,16 @@ static int update_head_to_default(git_repository *repo)
162162
return error;
163163
}
164164

165-
static int update_remote_head_byname(
166-
git_repository *repo,
167-
const char *remote_name,
168-
const char *tracking_branch_name,
169-
const char *reflog_message)
170-
{
171-
git_buf tracking_head_name = GIT_BUF_INIT;
172-
git_reference *remote_head = NULL;
173-
int error;
174-
175-
if ((error = git_buf_printf(&tracking_head_name,
176-
"%s%s/%s",
177-
GIT_REFS_REMOTES_DIR,
178-
remote_name,
179-
GIT_HEAD_FILE)) < 0)
180-
goto cleanup;
181-
182-
error = git_reference_symbolic_create(
183-
&remote_head,
184-
repo,
185-
git_buf_cstr(&tracking_head_name),
186-
tracking_branch_name,
187-
true,
188-
reflog_message);
189-
190-
cleanup:
191-
git_reference_free(remote_head);
192-
git_buf_dispose(&tracking_head_name);
193-
return error;
194-
}
195-
196165
static int update_remote_head(
197166
git_repository *repo,
198167
git_remote *remote,
199168
git_buf *target,
200169
const char *reflog_message)
201170
{
202171
git_refspec *refspec;
203-
git_buf tracking_branch_name = GIT_BUF_INIT;
172+
git_reference *remote_head = NULL;
173+
git_buf remote_head_name = GIT_BUF_INIT;
174+
git_buf remote_branch_name = GIT_BUF_INIT;
204175
int error;
205176

206177
/* Determine the remote tracking ref name from the local branch */
@@ -213,19 +184,30 @@ static int update_remote_head(
213184
}
214185

215186
if ((error = git_refspec_transform(
216-
&tracking_branch_name,
187+
&remote_branch_name,
217188
refspec,
218189
git_buf_cstr(target))) < 0)
219190
goto cleanup;
220191

221-
error = update_remote_head_byname(
222-
repo,
192+
if ((error = git_buf_printf(&remote_head_name,
193+
"%s%s/%s",
194+
GIT_REFS_REMOTES_DIR,
223195
git_remote_name(remote),
224-
git_buf_cstr(&tracking_branch_name),
196+
GIT_HEAD_FILE)) < 0)
197+
goto cleanup;
198+
199+
error = git_reference_symbolic_create(
200+
&remote_head,
201+
repo,
202+
git_buf_cstr(&remote_head_name),
203+
git_buf_cstr(&remote_branch_name),
204+
true,
225205
reflog_message);
226206

227207
cleanup:
228-
git_buf_dispose(&tracking_branch_name);
208+
git_reference_free(remote_head);
209+
git_buf_dispose(&remote_branch_name);
210+
git_buf_dispose(&remote_head_name);
229211
return error;
230212
}
231213

@@ -277,19 +259,20 @@ static int update_head_to_remote(
277259

278260
static int update_head_to_branch(
279261
git_repository *repo,
280-
const char *remote_name,
262+
git_remote *remote,
281263
const char *branch,
282264
const char *reflog_message)
283265
{
284266
int retcode;
285267
git_buf remote_branch_name = GIT_BUF_INIT;
286268
git_reference* remote_ref = NULL;
269+
git_buf default_branch = GIT_BUF_INIT;
287270

288-
GIT_ASSERT_ARG(remote_name);
271+
GIT_ASSERT_ARG(remote);
289272
GIT_ASSERT_ARG(branch);
290273

291274
if ((retcode = git_buf_printf(&remote_branch_name, GIT_REFS_REMOTES_DIR "%s/%s",
292-
remote_name, branch)) < 0 )
275+
git_remote_name(remote), branch)) < 0 )
293276
goto cleanup;
294277

295278
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(
299282
reflog_message)) < 0)
300283
goto cleanup;
301284

302-
retcode = update_remote_head_byname(repo, remote_name, remote_branch_name.ptr, reflog_message);
285+
if ((retcode = git_remote_default_branch(&default_branch, remote)) < 0)
286+
goto cleanup;
287+
288+
if (!git_remote__matching_refspec(remote, git_buf_cstr(&default_branch)))
289+
goto cleanup;
290+
291+
retcode = update_remote_head(repo, remote, &default_branch, reflog_message);
303292

304293
cleanup:
305294
git_reference_free(remote_ref);
306295
git_buf_dispose(&remote_branch_name);
296+
git_buf_dispose(&default_branch);
307297
return retcode;
308298
}
309299

@@ -388,8 +378,7 @@ static int checkout_branch(git_repository *repo, git_remote *remote, const git_c
388378
int error;
389379

390380
if (branch)
391-
error = update_head_to_branch(repo, git_remote_name(remote), branch,
392-
reflog_message);
381+
error = update_head_to_branch(repo, remote, branch, reflog_message);
393382
/* Point HEAD to the same ref as the remote's head */
394383
else
395384
error = update_head_to_remote(repo, remote, reflog_message);

tests/clone/nonetwork.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ void test_clone_nonetwork__can_checkout_given_branch(void)
172172

173173
cl_git_pass(git_reference_lookup(&remote_head, g_repo, "refs/remotes/origin/HEAD"));
174174
cl_assert_equal_i(GIT_REFERENCE_SYMBOLIC, git_reference_type(remote_head));
175-
cl_assert_equal_s("refs/remotes/origin/test", git_reference_symbolic_target(remote_head));
175+
cl_assert_equal_s("refs/remotes/origin/master", git_reference_symbolic_target(remote_head));
176176

177177
git_reference_free(remote_head);
178178
}

0 commit comments

Comments
 (0)