> OK, so the "fetch" side enables sideband-all any time it knows that > the other side supports it. > > It feels a bit strange at the logical level that reader.me is set > only when we are going to talk over "sideband-all". I know that at > the implementation level, reader.me is only looked at when sideband > is use, but it still feels somewhat funny. Future developers may > want to use reader.me to identify the entity that found some error > during a read, even when the sideband is not yet in use, and at that > point, uninitialized .me would be a source of an error. IOW, that > assignment smells like a timebomb waiting to go off. I think the best solution here is to initialize .me to "git", like how we do it for trace. I've done that for now. > > + switch (retval) { > > + case SIDEBAND_PROTOCOL_ERROR: > > Dedent (see previous step). Done. > > + case SIDEBAND_PRIMARY: > > + if (reader->pktlen != 1) > > + goto nonprogress; > > + /* > > + * Since pktlen is 1, this is a keepalive > > + * packet. Wait for the next one. > > + */ > > What guarantees that a normal payload packet is never of length==1? This is indeed assuming that we currently don't send 0004 (the equivalent of 0005\1 without the sideband). I chose this because it is currently what we use in create_pack_file() in upload-pack.c, but I'm OK with alternatives (e.g. if we use 0005\2 instead). > > + break; > > + default: /* SIDEBAND_PROGRESS */ > > + ; > > + } > > + } > > > > +nonprogress: > > It is totally unclear why this label is called nonprogress. Is it > that the primary purpose of the while loop above is to spin and eat > the keep-alive packets from the other side? If so, then it sort-of > makes sense (i.e. "we are looking for progress-meter related > packets, but now we found something else, so let's leave the loop"). > > It would have greatly helped reviewers to have a comment in front of > that infinite loop, perhaps like > > /* > * Spin and consume the keep-alive packets > */ [snip] Yes, it's meant to spin and consume the progress and keepalive packets. I've added a comment at the top of the loop and renamed the jump label to "nonprogress_received". > > if (reader->status == PACKET_READ_NORMAL) > > - reader->line = reader->buffer; > > + reader->line = reader->use_sideband ? > > + reader->buffer + 1 : reader->buffer; > > Is the one byte the sideband designator? Yes. Added comment to clarify that. > > void packet_writer_write(struct packet_writer *writer, const char *fmt, ...) > > @@ -521,7 +548,8 @@ void packet_writer_write(struct packet_writer *writer, const char *fmt, ...) > > va_list args; > > > > va_start(args, fmt); > > - packet_write_fmt_1(writer->dest_fd, 0, "", fmt, args); > > + packet_write_fmt_1(writer->dest_fd, 0, > > + writer->use_sideband ? "\1" : "", fmt, args); > > va_end(args); > > } > > As I am superstitious, I'd prefer to see octal literals to be fully > spelled out as 3-digit sequence, i.e. "\001". Likewise for "\003". Done. > > @@ -530,7 +558,8 @@ void packet_writer_error(struct packet_writer *writer, const char *fmt, ...) > > va_list args; > > > > va_start(args, fmt); > > - packet_write_fmt_1(writer->dest_fd, 0, "ERR ", fmt, args); > > + packet_write_fmt_1(writer->dest_fd, 0, > > + writer->use_sideband ? "\3" : "ERR ", fmt, args); > > OK, band#3 is an error message for emergency exit. It is a bit > curious that this patch does not show any line from the existing > code in the context that reacts to the ERR string, but that is > because the errors are noticed at a lot lower level when the > sideband is in use than the code that currently checks for errors? Yes - the branch that this patch set is on (ms/packet-err-check) handles this. I have taken care in this patch to ensure that the error message printed matches what Masaya used, so that in a future patch, when we force sideband-all (using GIT_TEST_SIDEBAND_ALL), the same message is printed so that the existing tests still pass.