vendor/libgit2/src/clone.c in rugged-1.0.1 vs vendor/libgit2/src/clone.c in rugged-1.1.0

- old
+ new

@@ -135,30 +135,101 @@ error = 0; return error; } +static int update_head_to_default(git_repository *repo) +{ + git_buf initialbranch = GIT_BUF_INIT; + const char *branch_name; + int error = 0; + + if ((error = git_repository_initialbranch(&initialbranch, repo)) < 0) + goto done; + + if (git__prefixcmp(initialbranch.ptr, GIT_REFS_HEADS_DIR) != 0) { + git_error_set(GIT_ERROR_INVALID, "invalid initial branch '%s'", initialbranch.ptr); + error = -1; + goto done; + } + + branch_name = initialbranch.ptr + strlen(GIT_REFS_HEADS_DIR); + + error = setup_tracking_config(repo, branch_name, GIT_REMOTE_ORIGIN, + initialbranch.ptr); + +done: + git_buf_dispose(&initialbranch); + return error; +} + +static int update_remote_head( + git_repository *repo, + git_remote *remote, + git_buf *target, + const char *reflog_message) +{ + git_refspec *refspec; + 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 */ + refspec = git_remote__matching_refspec(remote, git_buf_cstr(target)); + + if (refspec == NULL) { + git_error_set(GIT_ERROR_NET, "the remote's default branch does not fit the refspec configuration"); + error = GIT_EINVALIDSPEC; + goto cleanup; + } + + if ((error = git_refspec_transform( + &remote_branch_name, + refspec, + git_buf_cstr(target))) < 0) + goto cleanup; + + if ((error = git_buf_printf(&remote_head_name, + "%s%s/%s", + GIT_REFS_REMOTES_DIR, + git_remote_name(remote), + 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_reference_free(remote_head); + git_buf_dispose(&remote_branch_name); + git_buf_dispose(&remote_head_name); + return error; +} + static int update_head_to_remote( git_repository *repo, git_remote *remote, const char *reflog_message) { int error = 0; size_t refs_len; - git_refspec *refspec; const git_remote_head *remote_head, **refs; const git_oid *remote_head_id; - git_buf remote_master_name = GIT_BUF_INIT; git_buf branch = GIT_BUF_INIT; if ((error = git_remote_ls(&refs, &refs_len, remote)) < 0) return error; /* We cloned an empty repository or one with an unborn HEAD */ if (refs_len == 0 || strcmp(refs[0]->name, GIT_HEAD_FILE)) - return setup_tracking_config( - repo, "master", GIT_REMOTE_ORIGIN, GIT_REFS_HEADS_MASTER_FILE); + return update_head_to_default(repo); /* We know we have HEAD, let's see where it points */ remote_head = refs[0]; assert(remote_head); @@ -169,33 +240,20 @@ error = git_repository_set_head_detached( repo, remote_head_id); goto cleanup; } - refspec = git_remote__matching_refspec(remote, git_buf_cstr(&branch)); - - if (refspec == NULL) { - git_error_set(GIT_ERROR_NET, "the remote's default branch does not fit the refspec configuration"); - error = GIT_EINVALIDSPEC; + if ((error = update_remote_head(repo, remote, &branch, reflog_message)) < 0) goto cleanup; - } - /* Determine the remote tracking reference name from the local master */ - if ((error = git_refspec_transform( - &remote_master_name, - refspec, - git_buf_cstr(&branch))) < 0) - goto cleanup; - error = update_head_to_new_branch( repo, remote_head_id, git_buf_cstr(&branch), reflog_message); cleanup: - git_buf_dispose(&remote_master_name); git_buf_dispose(&branch); return error; } @@ -477,13 +535,15 @@ GIT_INIT_STRUCTURE_FROM_TEMPLATE( opts, version, git_clone_options, GIT_CLONE_OPTIONS_INIT); return 0; } +#ifndef GIT_DEPRECATE_HARD int git_clone_init_options(git_clone_options *opts, unsigned int version) { return git_clone_options_init(opts, version); } +#endif static bool can_link(const char *src, const char *dst, int link) { #ifdef GIT_WIN32 GIT_UNUSED(src);