]> git.proxmox.com Git - libgit2.git/commitdiff
clone: deploy git_repository_set_head() usage
authornulltoken <emeric.fermas@gmail.com>
Sat, 22 Sep 2012 10:50:18 +0000 (12:50 +0200)
committernulltoken <emeric.fermas@gmail.com>
Sun, 7 Oct 2012 19:03:49 +0000 (21:03 +0200)
src/clone.c

index 211288c2ca403c9e0f782cc312579613126543f8..c233977b7087213000736e7fb047ef771545ecdb 100644 (file)
@@ -28,7 +28,11 @@ struct HeadInfo {
        git_buf branchname;
 };
 
-static int create_tracking_branch(git_repository *repo, const git_oid *target, const char *name)
+static int create_tracking_branch(
+       git_reference **branch,
+       git_repository *repo,
+       const git_oid *target,
+       const char *name)
 {
        git_object *head_obj = NULL;
        git_reference *branch_ref;
@@ -42,7 +46,6 @@ static int create_tracking_branch(git_repository *repo, const git_oid *target, c
        if (!git_branch_create(&branch_ref, repo, name, head_obj, 0)) {
                git_config *cfg;
 
-               git_reference_free(branch_ref);
                /* Set up tracking */
                if (!git_repository_config(&cfg, repo)) {
                        git_buf remote = GIT_BUF_INIT;
@@ -63,6 +66,12 @@ static int create_tracking_branch(git_repository *repo, const git_oid *target, c
        }
 
        git_object_free(head_obj);
+
+       if (!retcode)
+               *branch = branch_ref;
+       else
+               git_reference_free(branch_ref);
+
        return retcode;
 }
 
@@ -84,21 +93,17 @@ static int reference_matches_remote_head(const char *head_name, void *payload)
 
 static int update_head_to_new_branch(git_repository *repo, const git_oid *target, const char *name)
 {
-       int retcode = GIT_ERROR;
+       git_reference *tracking_branch;
+       int error;
 
-       if (!create_tracking_branch(repo, target, name)) {
-               git_reference *head;
-               if (!git_reference_lookup(&head, repo, GIT_HEAD_FILE)) {
-                       git_buf targetbuf = GIT_BUF_INIT;
-                       if (!git_buf_printf(&targetbuf, GIT_REFS_HEADS_DIR "%s", name)) {
-                               retcode = git_reference_set_target(head, git_buf_cstr(&targetbuf));
-                       }
-                       git_buf_free(&targetbuf);
-                       git_reference_free(head);
-               }
-       }
+       if (create_tracking_branch(&tracking_branch, repo, target, name) < 0)
+               return -1;
 
-       return retcode;
+       error = git_repository_set_head(repo, git_reference_name(tracking_branch));
+
+       git_reference_free(tracking_branch);
+
+       return error;
 }
 
 static int update_head_to_remote(git_repository *repo, git_remote *remote)