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 <barkalow@iabervon.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
36c79d2bf8
commit
c13b2633f4
35
http-push.c
35
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;
|
||||
|
||||
if (http_fetch_ref(remote->url, ls->dentry_name + 5 /* "refs/" */,
|
||||
remote_sha1) != 0) {
|
||||
ref = alloc_ref(strlen(ls->dentry_name) + 1);
|
||||
strcpy(ref->name, ls->dentry_name);
|
||||
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user