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");
--
⑨