Merge branch 'jc/maint-co-track'
[gitweb.git] / remote.c
index c45d96e98fffe3411284144b6d836cf499d42ba4..e530a21e5c92e49012c459fba0eb7732672883c2 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -245,7 +245,7 @@ static void read_branches_file(struct remote *remote)
 {
        const char *slash = strchr(remote->name, '/');
        char *frag;
-       struct strbuf branch;
+       struct strbuf branch = STRBUF_INIT;
        int n = slash ? slash - remote->name : 1000;
        FILE *f = fopen(git_path("branches/%.*s", n, remote->name), "r");
        char *s, *p;
@@ -283,7 +283,6 @@ static void read_branches_file(struct remote *remote)
         * #branch specified.  The "master" (or specified) branch is
         * fetched and stored in the local branch of the same name.
         */
-       strbuf_init(&branch, 0);
        frag = strchr(p, '#');
        if (frag) {
                *(frag++) = '\0';
@@ -342,13 +341,14 @@ static int handle_config(const char *key, const char *value, void *cb)
        if (prefixcmp(key,  "remote."))
                return 0;
        name = key + 7;
+       if (*name == '/') {
+               warning("Config remote shorthand cannot begin with '/': %s",
+                       name);
+               return 0;
+       }
        subkey = strrchr(name, '.');
        if (!subkey)
                return error("Config with no key for remote %s", name);
-       if (*subkey == '/') {
-               warning("Config remote shorthand cannot begin with '/': %s", name);
-               return 0;
-       }
        remote = make_remote(name, subkey - name);
        if (!strcmp(subkey, ".mirror"))
                remote->mirror = git_config_bool(key, value);
@@ -749,18 +749,19 @@ int remote_find_tracking(struct remote *remote, struct refspec *refspec)
        return -1;
 }
 
-struct ref *alloc_ref(unsigned namelen)
+static struct ref *alloc_ref_with_prefix(const char *prefix, size_t prefixlen,
+               const char *name)
 {
-       struct ref *ret = xmalloc(sizeof(struct ref) + namelen);
-       memset(ret, 0, sizeof(struct ref) + namelen);
-       return ret;
+       size_t len = strlen(name);
+       struct ref *ref = xcalloc(1, sizeof(struct ref) + prefixlen + len + 1);
+       memcpy(ref->name, prefix, prefixlen);
+       memcpy(ref->name + prefixlen, name, len);
+       return ref;
 }
 
-struct ref *alloc_ref_from_str(const char* str)
+struct ref *alloc_ref(const char *name)
 {
-       struct ref *ret = alloc_ref(strlen(str) + 1);
-       strcpy(ret->name, str);
-       return ret;
+       return alloc_ref_with_prefix("", 0, name);
 }
 
 static struct ref *copy_ref(const struct ref *ref)
@@ -871,21 +872,20 @@ static struct ref *try_explicit_object_name(const char *name)
        struct ref *ref;
 
        if (!*name) {
-               ref = alloc_ref(20);
-               strcpy(ref->name, "(delete)");
+               ref = alloc_ref("(delete)");
                hashclr(ref->new_sha1);
                return ref;
        }
        if (get_sha1(name, sha1))
                return NULL;
-       ref = alloc_ref_from_str(name);
+       ref = alloc_ref(name);
        hashcpy(ref->new_sha1, sha1);
        return ref;
 }
 
 static struct ref *make_linked_ref(const char *name, struct ref ***tail)
 {
-       struct ref *ret = alloc_ref_from_str(name);
+       struct ref *ret = alloc_ref(name);
        tail_link_ref(ret, tail);
        return ret;
 }
@@ -1153,10 +1153,8 @@ static struct ref *get_expanded_map(const struct ref *remote_refs,
                        struct ref *cpy = copy_ref(ref);
                        match = ref->name + remote_prefix_len;
 
-                       cpy->peer_ref = alloc_ref(local_prefix_len +
-                                                 strlen(match) + 1);
-                       sprintf(cpy->peer_ref->name, "%s%s",
-                               refspec->dst, match);
+                       cpy->peer_ref = alloc_ref_with_prefix(refspec->dst,
+                                       local_prefix_len, match);
                        if (refspec->force)
                                cpy->peer_ref->force = 1;
                        *tail = cpy;
@@ -1189,25 +1187,18 @@ struct ref *get_remote_ref(const struct ref *remote_refs, const char *name)
 
 static struct ref *get_local_ref(const char *name)
 {
-       struct ref *ret;
        if (!name)
                return NULL;
 
-       if (!prefixcmp(name, "refs/")) {
-               return alloc_ref_from_str(name);
-       }
+       if (!prefixcmp(name, "refs/"))
+               return alloc_ref(name);
 
        if (!prefixcmp(name, "heads/") ||
            !prefixcmp(name, "tags/") ||
-           !prefixcmp(name, "remotes/")) {
-               ret = alloc_ref(strlen(name) + 6);
-               sprintf(ret->name, "refs/%s", name);
-               return ret;
-       }
+           !prefixcmp(name, "remotes/"))
+               return alloc_ref_with_prefix("refs/", 5, name);
 
-       ret = alloc_ref(strlen(name) + 12);
-       sprintf(ret->name, "refs/heads/%s", name);
-       return ret;
+       return alloc_ref_with_prefix("refs/heads/", 11, name);
 }
 
 int get_fetch_map(const struct ref *remote_refs,