@@ -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-
196165static 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
227207cleanup :
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
278260static 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
304293cleanup :
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 );
0 commit comments