From c13b2633f49e3e61b37973204793a4d9ef981175 Mon Sep 17 00:00:00 2001 From: Daniel Barkalow Date: Sat, 26 Apr 2008 15:53:09 -0400 Subject: Make walker.fetch_ref() take a struct ref. This simplifies a few things, makes a few things slightly more complicated, but, more importantly, allows that, when struct ref can represent a symref, http_fetch_ref() can return one. Incidentally makes the string that http_fetch_ref() gets include "refs/" (if appropriate), because that's how the name field of struct ref works. As far as I can tell, the usage in walker:interpret_target() wouldn't have worked previously, if it ever would have been used, which it wouldn't (since the fetch process uses the hash instead of the name of the ref there). Signed-off-by: Daniel Barkalow Signed-off-by: Junio C Hamano --- http-push.c | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) (limited to 'http-push.c') diff --git a/http-push.c b/http-push.c index 5b230380c..939a76460 100644 --- a/http-push.c +++ b/http-push.c @@ -1759,15 +1759,16 @@ static int one_local_ref(const char *refname, const unsigned char *sha1, int fla static void one_remote_ref(char *refname) { struct ref *ref; - unsigned char remote_sha1[20]; struct object *obj; - int len = strlen(refname) + 1; - if (http_fetch_ref(remote->url, refname + 5 /* "refs/" */, - remote_sha1) != 0) { + ref = alloc_ref(strlen(refname) + 1); + strcpy(ref->name, refname); + + if (http_fetch_ref(remote->url, ref) != 0) { fprintf(stderr, "Unable to fetch ref %s from %s\n", refname, remote->url); + free(ref); return; } @@ -1775,18 +1776,15 @@ static void one_remote_ref(char *refname) * Fetch a copy of the object if it doesn't exist locally - it * may be required for updating server info later. */ - if (remote->can_update_info_refs && !has_sha1_file(remote_sha1)) { - obj = lookup_unknown_object(remote_sha1); + if (remote->can_update_info_refs && !has_sha1_file(ref->old_sha1)) { + obj = lookup_unknown_object(ref->old_sha1); if (obj) { fprintf(stderr, " fetch %s for %s\n", - sha1_to_hex(remote_sha1), refname); + sha1_to_hex(ref->old_sha1), refname); add_fetch_request(obj); } } - ref = xcalloc(1, sizeof(*ref) + len); - hashcpy(ref->old_sha1, remote_sha1); - memcpy(ref->name, refname, len); *remote_tail = ref; remote_tail = &ref->next; } @@ -1891,33 +1889,37 @@ static void mark_edges_uninteresting(struct commit_list *list) static void add_remote_info_ref(struct remote_ls_ctx *ls) { struct strbuf *buf = (struct strbuf *)ls->userData; - unsigned char remote_sha1[20]; struct object *o; int len; char *ref_info; + struct ref *ref; + + ref = alloc_ref(strlen(ls->dentry_name) + 1); + strcpy(ref->name, ls->dentry_name); - if (http_fetch_ref(remote->url, ls->dentry_name + 5 /* "refs/" */, - remote_sha1) != 0) { + if (http_fetch_ref(remote->url, ref) != 0) { fprintf(stderr, "Unable to fetch ref %s from %s\n", ls->dentry_name, remote->url); aborted = 1; + free(ref); return; } - o = parse_object(remote_sha1); + o = parse_object(ref->old_sha1); if (!o) { fprintf(stderr, "Unable to parse object %s for remote ref %s\n", - sha1_to_hex(remote_sha1), ls->dentry_name); + sha1_to_hex(ref->old_sha1), ls->dentry_name); aborted = 1; + free(ref); return; } len = strlen(ls->dentry_name) + 42; ref_info = xcalloc(len + 1, 1); sprintf(ref_info, "%s %s\n", - sha1_to_hex(remote_sha1), ls->dentry_name); + sha1_to_hex(ref->old_sha1), ls->dentry_name); fwrite_buffer(ref_info, 1, len, buf); free(ref_info); @@ -1932,6 +1934,7 @@ static void add_remote_info_ref(struct remote_ls_ctx *ls) free(ref_info); } } + free(ref); } static void update_remote_info_refs(struct remote_lock *lock) -- cgit v1.2.1