Skip to content

Commit

Permalink
Make ls-remote http://... list HEAD, like for git://...
Browse files Browse the repository at this point in the history
This makes a struct ref able to represent a symref, and makes http.c
able to recognize one, and makes transport.c look for "HEAD" as a ref
in the list, and makes it dereference symrefs for the resulting ref,
if any.

Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Daniel Barkalow authored and Junio C Hamano committed Apr 27, 2008
1 parent c13b263 commit be885d9
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 2 deletions.
1 change: 1 addition & 0 deletions cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -634,6 +634,7 @@ struct ref {
struct ref *next;
unsigned char old_sha1[20];
unsigned char new_sha1[20];
char *symref;
unsigned int force:1,
merge:1,
nonfastforward:1,
Expand Down
5 changes: 4 additions & 1 deletion http.c
Original file line number Diff line number Diff line change
Expand Up @@ -626,7 +626,10 @@ int http_fetch_ref(const char *base, struct ref *ref)
strbuf_rtrim(&buffer);
if (buffer.len == 40)
ret = get_sha1_hex(buffer.buf, ref->old_sha1);
else
else if (!prefixcmp(buffer.buf, "ref: ")) {
ref->symref = xstrdup(buffer.buf + 5);
ret = 0;
} else
ret = 1;
} else {
ret = error("Couldn't get %s for %s\n%s",
Expand Down
23 changes: 22 additions & 1 deletion remote.c
Original file line number Diff line number Diff line change
Expand Up @@ -706,13 +706,22 @@ struct ref *copy_ref_list(const struct ref *ref)
return ret;
}

void free_ref(struct ref *ref)
{
if (!ref)
return;
free(ref->remote_status);
free(ref->symref);
free(ref);
}

void free_refs(struct ref *ref)
{
struct ref *next;
while (ref) {
next = ref->next;
free(ref->peer_ref);
free(ref);
free_ref(ref);
ref = next;
}
}
Expand Down Expand Up @@ -1172,3 +1181,15 @@ int get_fetch_map(const struct ref *remote_refs,

return 0;
}

int resolve_remote_symref(struct ref *ref, struct ref *list)
{
if (!ref->symref)
return 0;
for (; list; list = list->next)
if (!strcmp(ref->symref, list->name)) {
hashcpy(ref->old_sha1, list->old_sha1);
return 0;
}
return 1;
}
2 changes: 2 additions & 0 deletions remote.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ int check_ref_type(const struct ref *ref, int flags);
*/
void free_refs(struct ref *ref);

int resolve_remote_symref(struct ref *ref, struct ref *list);

/*
* Removes and frees any duplicate refs in the map.
*/
Expand Down
14 changes: 14 additions & 0 deletions transport.c
Original file line number Diff line number Diff line change
Expand Up @@ -441,10 +441,14 @@ static struct ref *get_refs_via_curl(struct transport *transport)
struct ref *ref = NULL;
struct ref *last_ref = NULL;

struct walker *walker;

if (!transport->data)
transport->data = get_http_walker(transport->url,
transport->remote);

walker = transport->data;

refs_url = xmalloc(strlen(transport->url) + 11);
sprintf(refs_url, "%s/info/refs", transport->url);

Expand Down Expand Up @@ -500,6 +504,16 @@ static struct ref *get_refs_via_curl(struct transport *transport)

strbuf_release(&buffer);

ref = alloc_ref(strlen("HEAD") + 1);
strcpy(ref->name, "HEAD");
if (!walker->fetch_ref(walker, ref) &&
!resolve_remote_symref(ref, refs)) {
ref->next = refs;
refs = ref;
} else {
free(ref);
}

return refs;
}

Expand Down

0 comments on commit be885d9

Please sign in to comment.