]> git.proxmox.com Git - libgit2.git/blobdiff - src/remote.c
Merge pull request #444 from carlosmn/fetch-fixes
[libgit2.git] / src / remote.c
index 74a238d959472d8f04d826abcc34965227f5155a..a557a4930529ff6b920c1d89557159584af7ce6d 100644 (file)
@@ -216,15 +216,10 @@ int git_remote_download(char **filename, git_remote *remote)
        return git_fetch_download_pack(filename, remote);
 }
 
-git_headarray *git_remote_tips(git_remote *remote)
-{
-       return &remote->refs;
-}
-
 int git_remote_update_tips(struct git_remote *remote)
 {
        int error = GIT_SUCCESS;
-       unsigned int i;
+       unsigned int i = 0;
        char refname[GIT_PATH_MAX];
        git_headarray *refs = &remote->refs;
        git_remote_head *head;
@@ -233,8 +228,21 @@ int git_remote_update_tips(struct git_remote *remote)
 
        memset(refname, 0x0, sizeof(refname));
 
-       for (i = 0; i < refs->len; ++i) {
+       if (refs->len == 0)
+               return GIT_SUCCESS;
+
+       /* HEAD is only allowed to be the first in the list */
+       head = refs->heads[0];
+       if (!strcmp(head->name, GIT_HEAD_FILE)) {
+               error = git_reference_create_oid(&ref, remote->repo, GIT_FETCH_HEAD_FILE, &head->oid, 1);
+               i = 1;
+               if (error < GIT_SUCCESS)
+                       return git__rethrow(error, "Failed to update FETCH_HEAD");
+       }
+
+       for (; i < refs->len; ++i) {
                head = refs->heads[i];
+
                error = git_refspec_transform(refname, sizeof(refname), spec, head->name);
                if (error < GIT_SUCCESS)
                        return error;
@@ -249,6 +257,9 @@ int git_remote_update_tips(struct git_remote *remote)
 
 void git_remote_free(git_remote *remote)
 {
+       if (remote == NULL)
+               return;
+
        free(remote->fetch.src);
        free(remote->fetch.dst);
        free(remote->push.src);