git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 2/2] transport: unambiguously determine local HEAD

From
Jeff King <peff@peff.net>
Date
Feb 15, 2009, 20:01 UTC
Message-ID
<20090215200131.GB26779@coredump.intra.peff.net>
In-Reply-To
<20090215195826.GA26740@coredump.intra.peff.net>

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@peff.net>
---
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
Previous: Jeff KingNext: Jeff King
Message 34 of 41 in “remote HEAD improvements take 2”
  1. 0/4 remote HEAD improvements take 2Jay Soffian, Feb 13, 2009
  2. 1/4 builtin-clone: move locate_head() to remote.c so it can be re-usedJay Soffian, Feb 13, 2009
  3. 2/4 builtin-remote: move duplicated cleanup code its own functionJay Soffian, Feb 13, 2009
  4. 3/4 builtin-remote: teach show to display remote HEADJay Soffian, Feb 13, 2009
  5. 4/4 builtin-remote: add set-head verbJay Soffian, Feb 13, 2009
  6. Junio C HamanoFeb 13, 2009
  7. Jay SoffianFeb 13, 2009
  8. 4/4 builtin-remote: add set-head subcommandJay Soffian, Feb 13, 2009
  9. Junio C HamanoFeb 13, 2009
  10. Jay SoffianFeb 13, 2009
  11. Jeff KingFeb 14, 2009
  12. Junio C HamanoFeb 14, 2009
  13. Jeff KingFeb 14, 2009
  14. Jay SoffianFeb 14, 2009
  15. Jay SoffianFeb 14, 2009
  16. Jeff KingFeb 14, 2009
  17. builtin-remote: better handling of multiple remote HEADsJay Soffian, Feb 14, 2009
  18. Jeff KingFeb 14, 2009
  19. Jay SoffianFeb 14, 2009
  20. Jeff KingFeb 14, 2009
  21. Junio C HamanoFeb 14, 2009
  22. Daniel BarkalowFeb 14, 2009
  23. Jeff KingFeb 14, 2009
  24. Jeff KingFeb 15, 2009
  25. 1/5 test scripts: refactor start_httpd helperJeff King, Feb 15, 2009
  26. 2/5 add basic http clone/fetch testsJeff King, Feb 15, 2009
  27. Junio C HamanoFeb 15, 2009
  28. 3/5 refactor find_refs_by_name to accept const listJeff King, Feb 15, 2009
  29. 4/5 remote: refactor guess_remote_headJeff King, Feb 15, 2009
  30. 5/5 remote: use exact HEAD lookup if it is availableJeff King, Feb 15, 2009
  31. Jay SoffianFeb 15, 2009
  32. Jeff KingFeb 15, 2009
  33. 1/2 transport: cleanup duplicated ref fetching codeJeff King, Feb 15, 2009
  34. 2/2 transport: unambiguously determine local HEADJeff King, Feb 15, 2009
  35. Jeff KingFeb 15, 2009
  36. Jeff KingFeb 15, 2009
  37. Jay SoffianFeb 15, 2009
  38. Jeff KingFeb 15, 2009
  39. Junio C HamanoFeb 16, 2009
  40. Jay SoffianFeb 16, 2009
  41. Jay SoffianFeb 13, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.