Download raw body.
fix capabilities sent by gotsh if no refs exist
On 2022/11/07 21:36:13 +0100, Stefan Sperling <stsp@stsp.name> wrote: > If the repository contains no references we announce capabilities via > send_zero_refs(). This function does not yet handle the repo_write case, > resulting in invalid capabilities being announced to the client. > > In particular, we do not announce the 'report' capability but send reports > regardless, which results in an "unexpected message from server" error > being reported by got clone/fetch. > > ok? sure, ok you could factor the two if (err) after the outer if and save some braces. > diff 593af7bd3baeb8314b7ef9a11fe0559a6ba9557d 5a3cf3b6bde9a6f3b33391a2229d7a6870417361 > commit - 593af7bd3baeb8314b7ef9a11fe0559a6ba9557d > commit + 5a3cf3b6bde9a6f3b33391a2229d7a6870417361 > blob - 85ee3e8503a054b2d587e80262d305695c1c8449 > blob + b8131d3c9afbbd434818c6c64743b9be8d7edf13 > --- lib/serve.c > +++ lib/serve.c > @@ -220,7 +220,7 @@ send_zero_refs(int outfd, int chattygot) > } > > static const struct got_error * > -send_zero_refs(int outfd, int chattygot) > +send_zero_refs(int outfd, int client_is_reading, int chattygot) > { > const struct got_error *err = NULL; > char buf[GOT_PKT_MAX]; > @@ -237,10 +237,18 @@ send_zero_refs(int outfd, int chattygot) > if (len >= sizeof(buf)) > return got_error(GOT_ERR_NO_SPACE); > > - err = got_gitproto_append_capabilities(&capalen, buf, len, > - sizeof(buf), read_capabilities, nitems(read_capabilities)); > - if (err) > - return err; > + if (client_is_reading) { > + err = got_gitproto_append_capabilities(&capalen, buf, len, > + sizeof(buf), read_capabilities, nitems(read_capabilities)); > + if (err) > + return err; > + } else { > + err = got_gitproto_append_capabilities(&capalen, buf, len, > + sizeof(buf), write_capabilities, > + nitems(write_capabilities)); > + if (err) > + return err; > + } > > return got_pkt_writepkt(outfd, buf, len + capalen, chattygot); > } > @@ -315,7 +323,8 @@ announce_refs(int outfd, struct imsgbuf *ibuf, int cli > nrefs = ireflist.nrefs; > have_nrefs = 1; > if (nrefs == 0) > - err = send_zero_refs(outfd, chattygot); > + err = send_zero_refs(outfd, client_is_reading, > + chattygot); > break; > case GOTD_IMSG_REF: > if (!have_nrefs || nrefs == 0) {
fix capabilities sent by gotsh if no refs exist