remote: simplify guess_remote_head()
[git/git.git] / builtin-clone.c
index f73029e..f9ce4fb 100644 (file)
@@ -20,6 +20,7 @@
 #include "dir.h"
 #include "pack-refs.h"
 #include "sigchain.h"
+#include "remote.h"
 
 /*
  * Overall FIXMEs:
@@ -293,43 +294,6 @@ static void remove_junk_on_signal(int signo)
        raise(signo);
 }
 
-static const struct ref *locate_head(const struct ref *refs,
-                                    const struct ref *mapped_refs,
-                                    const struct ref **remote_head_p)
-{
-       const struct ref *remote_head = NULL;
-       const struct ref *remote_master = NULL;
-       const struct ref *r;
-       for (r = refs; r; r = r->next)
-               if (!strcmp(r->name, "HEAD"))
-                       remote_head = r;
-
-       for (r = mapped_refs; r; r = r->next)
-               if (!strcmp(r->name, "refs/heads/master"))
-                       remote_master = r;
-
-       if (remote_head_p)
-               *remote_head_p = remote_head;
-
-       /* If there's no HEAD value at all, never mind. */
-       if (!remote_head)
-               return NULL;
-
-       /* If refs/heads/master could be right, it is. */
-       if (remote_master && !hashcmp(remote_master->old_sha1,
-                                     remote_head->old_sha1))
-               return remote_master;
-
-       /* Look for another ref that points there */
-       for (r = mapped_refs; r; r = r->next)
-               if (r != remote_head &&
-                   !hashcmp(r->old_sha1, remote_head->old_sha1))
-                       return r;
-
-       /* Nothing is the same */
-       return NULL;
-}
-
 static struct ref *write_remote_refs(const struct ref *refs,
                struct refspec *refspec, const char *reflog)
 {
@@ -350,6 +314,19 @@ static struct ref *write_remote_refs(const struct ref *refs,
        return local_refs;
 }
 
+static void install_branch_config(const char *local,
+                                 const char *origin,
+                                 const char *remote)
+{
+       struct strbuf key = STRBUF_INIT;
+       strbuf_addf(&key, "branch.%s.remote", local);
+       git_config_set(key.buf, origin);
+       strbuf_reset(&key);
+       strbuf_addf(&key, "branch.%s.merge", local);
+       git_config_set(key.buf, remote);
+       strbuf_release(&key);
+}
+
 int cmd_clone(int argc, const char **argv, const char *prefix)
 {
        int use_local_hardlinks = 1;
@@ -532,13 +509,17 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
 
                mapped_refs = write_remote_refs(refs, &refspec, reflog_msg.buf);
 
-               head_points_at = locate_head(refs, mapped_refs, &remote_head);
+               remote_head = find_ref_by_name(refs, "HEAD");
+               head_points_at = guess_remote_head(remote_head, mapped_refs);
        }
        else {
                warning("You appear to have cloned an empty repository.");
                head_points_at = NULL;
                remote_head = NULL;
                option_no_checkout = 1;
+               if (!option_bare)
+                       install_branch_config("master", option_origin,
+                                             "refs/heads/master");
        }
 
        if (head_points_at) {
@@ -567,11 +548,8 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
                                      head_points_at->peer_ref->name,
                                      reflog_msg.buf);
 
-                       strbuf_addf(&key, "branch.%s.remote", head);
-                       git_config_set(key.buf, option_origin);
-                       strbuf_reset(&key);
-                       strbuf_addf(&key, "branch.%s.merge", head);
-                       git_config_set(key.buf, head_points_at->name);
+                       install_branch_config(head, option_origin,
+                                             head_points_at->name);
                }
        } else if (remote_head) {
                /* Source had detached HEAD pointing somewhere. */