]> git.proxmox.com Git - libgit2.git/commitdiff
remote: create FETCH_HEAD with a refspecless remote
authorCarlos Martín Nieto <cmn@dwim.me>
Sat, 26 Oct 2013 15:35:12 +0000 (17:35 +0200)
committerCarlos Martín Nieto <cmn@dwim.me>
Fri, 1 Nov 2013 21:47:06 +0000 (22:47 +0100)
When downloading the default branch due to lack of refspecs, we still
need to write out FETCH_HEAD with the tip we downloaded, unfortunately
with a format that doesn't match what we already have.

src/fetchhead.c
src/remote.c

index 4dcebb857d50a30a69baf7d79ee10430bf08223e..77aafc8f36cf1e33945589256c33094be4d15d75 100644 (file)
@@ -74,6 +74,7 @@ static int fetchhead_ref_write(
 {
        char oid[GIT_OID_HEXSZ + 1];
        const char *type, *name;
+       int head = 0;
 
        assert(file && fetchhead_ref);
 
@@ -87,11 +88,16 @@ static int fetchhead_ref_write(
                GIT_REFS_TAGS_DIR) == 0) {
                type = "tag ";
                name = fetchhead_ref->ref_name + strlen(GIT_REFS_TAGS_DIR);
+       } else if (!git__strcmp(fetchhead_ref->ref_name, GIT_HEAD_FILE)) {
+               head = 1;
        } else {
                type = "";
                name = fetchhead_ref->ref_name;
        }
 
+       if (head)
+               return git_filebuf_printf(file, "%s\t\t%s\n", oid, fetchhead_ref->remote_url);
+
        return git_filebuf_printf(file, "%s\t%s\t%s'%s' of %s\n",
                oid,
                (fetchhead_ref->is_merge) ? "" : "not-for-merge",
index 3528b1c46f2ea1d04e50537545a26b3cd3615e67..2b611aabc560b1a3ad3acd7a2c9f52d147c291e1 100644 (file)
@@ -1032,6 +1032,27 @@ int git_remote_update_tips(git_remote *remote)
                        goto out;
        }
 
+       /* If we have no refspecs, update HEAD -> FETCH_HEAD manually */
+       if (remote->refspecs.length == 0 && refs.length > 0 && git_remote_update_fetchhead(remote)) {
+               git_vector vec;
+               git_refspec headspec;
+
+               if (git_refspec__parse(&headspec, "HEAD", true) < 0)
+                       goto out;
+
+               if (git_vector_init(&vec, 1, NULL) < 0) {
+                       goto out;
+               }
+
+               if (git_vector_insert(&vec, git_vector_get(&refs, 0)) < 0) {
+                       git_vector_free(&vec);
+                       goto out;
+               }
+
+               error = git_remote_write_fetchhead(remote, &headspec, &vec);
+               git_vector_free(&vec);
+       }
+
 out:
        git_refspec__free(&tagspec);
        git_vector_free(&refs);