When we fetch refs using the git protocol, we have to guess at which ref is pointed to by the HEAD. In the case of a local filesystem repo, however, we can cheat by going to that repo and peeking directly at the contents of HEAD. Signed-off-by: Jeff King <peff@xxxxxxxx> --- Again, this fails tests in t5505, and is not meant for inclusion. transport.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 files changed, 39 insertions(+), 0 deletions(-) diff --git a/transport.c b/transport.c index c9f31f6..e575203 100644 --- a/transport.c +++ b/transport.c @@ -12,6 +12,8 @@ #include "dir.h" #include "refs.h" +static int is_local(const char *url); + /* rsync support */ /* @@ -609,6 +611,40 @@ static int connect_setup(struct transport *transport) return 0; } +static void mark_head_via_local(const char *url, struct ref *refs) +{ + static const char *argv[] = { "symbolic-ref", "HEAD", NULL }; + static const char *env[] = { GIT_DIR_ENVIRONMENT, NULL }; + struct child_process cmd; + struct ref *head; + struct strbuf buf = STRBUF_INIT; + + head = find_ref_by_name(refs, "HEAD"); + if (!head) + return; + + memset(&cmd, 0, sizeof cmd); + cmd.argv = argv; + cmd.env = env; + cmd.dir = url; + cmd.git_cmd = 1; + cmd.no_stdin = 1; + cmd.no_stderr = 1; + cmd.out = -1; + + if (start_command(&cmd) < 0) + return; + if (strbuf_read(&buf, cmd.out, 64) < 0) + return; + if (finish_command(&cmd) != 0) { + strbuf_release(&buf); + return; + } + + strbuf_trim(&buf); + head->symref = strbuf_detach(&buf, NULL); +} + static struct ref *get_refs_via_connect(struct transport *transport) { struct git_transport_data *data = transport->data; @@ -617,6 +653,9 @@ static struct ref *get_refs_via_connect(struct transport *transport) connect_setup(transport); get_remote_heads(data->fd[0], &refs, 0, NULL, 0, NULL); + if (is_local(transport->url)) + mark_head_via_local(transport->url, refs); + return refs; } -- 1.6.2.rc0.258.gcef3.dirty -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html