ref: 30e4e3f5824f38f8014ab45326b2da379055d204
parent: 8b91022c14fe5c1ac957bedb0c3fd90941120d49
	author: Ori Bernstein <ori@eigenstate.org>
	date: Mon Apr 17 17:11:47 EDT 2023
	
git/send: correctly delete branches with no local mirror
--- a/sys/src/cmd/git/proto.c
+++ b/sys/src/cmd/git/proto.c
@@ -58,8 +58,10 @@
char *e;
int n;
- if(readn(c->rfd, len, 4) != 4)
-		sysfatal("pktline: short read from transport");+	if(readn(c->rfd, len, 4) != 4){+		werrstr("pktline: short read from transport");+ return -1;
+ }
len[4] = 0;
n = strtol(len, &e, 16);
 	if(n == 0){--- a/sys/src/cmd/git/ref.c
+++ b/sys/src/cmd/git/ref.c
@@ -125,6 +125,8 @@
nskip = 0;
 	for(i = 0; i < nhead; i++){+ if(hasheq(&head[i], &Zhash))
+ continue;
 		if((o = readobject(head[i])) == nil){fprint(2, "warning: %H does not point at commit\n", head[i]);
 			werrstr("read head %H: %r", head[i]);@@ -140,6 +142,8 @@
unref(o);
}
 	for(i = 0; i < ntail; i++){+ if(hasheq(&head[i], &Zhash))
+ continue;
 		if((o = readobject(tail[i])) == nil){ 			werrstr("read tail %H: %r", tail[i]);return -1;
--- a/sys/src/cmd/git/send.c
+++ b/sys/src/cmd/git/send.c
@@ -75,9 +75,11 @@
 			sysfatal("smprint: %r");if((idx = findref(ref, nu, r)) == -1)
idx = nu++;
+ else
+ free(ref[idx]);
assert(idx < nremoved + nbranch);
memcpy(&tail[idx], &Zhash, sizeof(Hash));
- free(r);
+ ref[idx] = r;
}
dprint(1, "nu: %d\n", nu);
for(i = 0; i < nu; i++)
@@ -184,7 +186,10 @@
p = nil;
if(a != nil && b != nil)
p = ancestor(a, b);
-		if(!force && !hasheq(&m->theirs, &Zhash) && (a == nil || p != a)){+ if(!force
+ && !hasheq(&m->theirs, &Zhash)
+ && !hasheq(&m->ours, &Zhash)
+		&& (a == nil || p != a)){fprint(2, "remote has diverged\n");
 			werrstr("remote diverged");flushpkt(c);
--
⑨