@@ -930,23 +930,50 @@ static int remote_head_for_fetchspec_src(git_remote_head **out, git_vector *upda
930
930
return 0 ;
931
931
}
932
932
933
+ static int ref_to_update (int * update , git_buf * remote_name , git_remote * remote , git_refspec * spec , const char * ref_name )
934
+ {
935
+ int error = 0 ;
936
+ git_repository * repo ;
937
+ git_buf upstream_remote = GIT_BUF_INIT ;
938
+ git_buf upstream_name = GIT_BUF_INIT ;
939
+
940
+ repo = git_remote_owner (remote );
941
+
942
+ if ((!git_reference__is_branch (ref_name )) ||
943
+ !git_remote_name (remote ) ||
944
+ (error = git_branch_upstream_remote (& upstream_remote , repo , ref_name ) < 0 ) ||
945
+ git__strcmp (git_remote_name (remote ), git_buf_cstr (& upstream_remote )) ||
946
+ (error = git_branch_upstream_name (& upstream_name , repo , ref_name )) < 0 ||
947
+ !git_refspec_dst_matches (spec , git_buf_cstr (& upstream_name )) ||
948
+ (error = git_refspec_rtransform (remote_name , spec , upstream_name .ptr )) < 0 ) {
949
+ /* Not an error if there is no upstream */
950
+ if (error == GIT_ENOTFOUND ) {
951
+ giterr_clear ();
952
+ error = 0 ;
953
+ }
954
+
955
+ * update = 0 ;
956
+ } else {
957
+ * update = 1 ;
958
+ }
959
+
960
+ git_buf_free (& upstream_remote );
961
+ git_buf_free (& upstream_name );
962
+ return error ;
963
+ }
964
+
933
965
static int remote_head_for_ref (git_remote_head * * out , git_remote * remote , git_refspec * spec , git_vector * update_heads , git_reference * ref )
934
966
{
935
967
git_reference * resolved_ref = NULL ;
936
968
git_buf remote_name = GIT_BUF_INIT ;
937
- git_buf upstream_name = GIT_BUF_INIT ;
938
- git_buf config_key = GIT_BUF_INIT ;
939
- git_repository * repo ;
940
969
git_config * config = NULL ;
941
- const char * ref_name , * branch_remote ;
942
- int error = 0 ;
970
+ const char * ref_name ;
971
+ int error = 0 , update ;
943
972
944
973
assert (out && spec && ref );
945
974
946
975
* out = NULL ;
947
976
948
- repo = git_reference_owner (ref );
949
-
950
977
error = git_reference_resolve (& resolved_ref , ref );
951
978
952
979
/* If we're in an unborn branch, let's pretend nothing happened */
@@ -957,29 +984,14 @@ static int remote_head_for_ref(git_remote_head **out, git_remote *remote, git_re
957
984
ref_name = git_reference_name (resolved_ref );
958
985
}
959
986
960
- if ((!git_reference__is_branch (ref_name )) ||
961
- (error = git_repository_config_snapshot (& config , repo )) < 0 ||
962
- (error = git_buf_printf (& config_key , "branch.%s.remote" ,
963
- ref_name + strlen (GIT_REFS_HEADS_DIR ))) < 0 ||
964
- (error = git_config_get_string (& branch_remote , config , git_buf_cstr (& config_key ))) < 0 ||
965
- git__strcmp (git_remote_name (remote ), branch_remote ) ||
966
- (error = git_branch_upstream_name (& upstream_name , repo , ref_name )) < 0 ||
967
- !git_refspec_dst_matches (spec , git_buf_cstr (& upstream_name )) ||
968
- (error = git_refspec_rtransform (& remote_name , spec , upstream_name .ptr )) < 0 ) {
969
- /* Not an error if there is no upstream */
970
- if (error == GIT_ENOTFOUND )
971
- error = 0 ;
972
-
987
+ if ((error = ref_to_update (& update , & remote_name , remote , spec , ref_name )) < 0 )
973
988
goto cleanup ;
974
- }
975
989
976
- error = remote_head_for_fetchspec_src (out , update_heads , git_buf_cstr (& remote_name ));
990
+ if (update )
991
+ error = remote_head_for_fetchspec_src (out , update_heads , git_buf_cstr (& remote_name ));
977
992
978
993
cleanup :
979
994
git_reference_free (resolved_ref );
980
- git_buf_free (& remote_name );
981
- git_buf_free (& upstream_name );
982
- git_buf_free (& config_key );
983
995
git_config_free (config );
984
996
return error ;
985
997
}
0 commit comments