shithub: front

Download patch

ref: 487c2dc215f3c0445480d8f2e266c16f3a53f657
parent: 703bcae2edde33b513d53865fd33e90d5a8db843
author: Ori Bernstein <ori@eigenstate.org>
date: Tue Jul 23 19:42:59 EDT 2024

git: provide symref extension

--- a/sys/src/cmd/git/ref.c
+++ b/sys/src/cmd/git/ref.c
@@ -386,8 +386,8 @@
 	return -1;
 
 found:
-	if(r == -1 && strstr(s, "ref: ") == s)
-		r = readref(h, s + strlen("ref: "));
+	if(r == -1 && strncmp(s, "ref: ", 5) == 0)
+		r = readref(h, s + 5);
 	return r;
 }
 
--- a/sys/src/cmd/git/serve.c
+++ b/sys/src/cmd/git/serve.c
@@ -21,20 +21,45 @@
 	sysfatal("%s", msg);
 }
 
+char*
+gethead(Hash *h, char *ref, int nref)
+{
+	int fd, n;
+	char *s;
+
+	if((fd = open(".git/HEAD", OREAD)) == -1)
+		return nil;
+	if((n = readn(fd, ref, nref-1)) == -1)
+		return nil;
+	while(n > 0 && ref[n-1] == '\n' || ref[n-1] == '\t' || ref[n-1] == ' ')
+		n--;
+	if(strncmp(ref, "ref: ", 5) != 0)
+		return nil;
+	s = ref+5;
+	if(resolveref(h, s) == -1)
+		return nil;
+	return s;
+}
+
 int
 showrefs(Conn *c)
 {
-	int i, ret, nrefs;
+	char **names, *s, buf[256];
+	int i, r, ret, nrefs;
 	Hash head, *refs;
-	char **names;
 
 	ret = -1;
 	nrefs = 0;
 	refs = nil;
 	names = nil;
-	if(resolveref(&head, "HEAD") != -1)
-		if(fmtpkt(c, "%H HEAD\n", head) == -1)
-			goto error;
+
+	s = gethead(&head,  buf, sizeof(buf));
+	if(s != nil)
+		r = fmtpkt(c, "%H HEAD%csymref=HEAD:%s\n", head, 0, s);
+	else
+		r = fmtpkt(c, "%H HEAD\n", head);
+	if(r == -1)
+		goto error;
 
 	if((nrefs = listrefs(&refs, &names)) == -1)
 		fail(c, "listrefs: %r");
--