X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=remote.c;h=e530a21e5c92e49012c459fba0eb7732672883c2;hb=bfd59c493d2be76adbc281df15a20aae766128fc;hp=3f3c789653a23e829369429da093c1193b53b015;hpb=cb2c7daf52906764d3c8f96cf358bdc7a2c7995a;p=git.git diff --git a/remote.c b/remote.c index 3f3c78965..e530a21e5 100644 --- 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); @@ -455,7 +455,7 @@ static int verify_refname(char *name, int is_glob) * and dst pointers are always freeable pointers as well * as the refspec pointer itself. */ -void free_refspecs(struct refspec *refspec, int nr_refspec) +static void free_refspecs(struct refspec *refspec, int nr_refspec) { int i; @@ -613,7 +613,7 @@ struct refspec *parse_fetch_refspec(int nr_refspec, const char **refspec) return parse_refspec_internal(nr_refspec, refspec, 1, 0); } -struct refspec *parse_push_refspec(int nr_refspec, const char **refspec) +static struct refspec *parse_push_refspec(int nr_refspec, const char **refspec) { return parse_refspec_internal(nr_refspec, refspec, 0, 0); } @@ -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) @@ -783,7 +784,7 @@ struct ref *copy_ref_list(const struct ref *ref) return ret; } -void free_ref(struct ref *ref) +static void free_ref(struct ref *ref) { if (!ref) return; @@ -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,