On 02/26, Jonathan Nieder wrote: > Brandon Williams wrote: > > static char *server_capabilities; > > +static struct argv_array server_capabilities_v2 = ARGV_ARRAY_INIT; > > Can a quick doc comment describe these and how they relate? > > Is only one of them set, based on which protocol version is in use? > Should server_capabilities be renamed to server_capabilities_v1? yes that's correct. I can rename it. > > +{ > > + int ret = 1; > > + int i = 0; > > + struct object_id old_oid; > > + struct ref *ref; > > + struct string_list line_sections = STRING_LIST_INIT_DUP; > > + > > + if (string_list_split(&line_sections, line, ' ', -1) < 2) { > > Can there be a comment describing the expected format? Yep I'll write a comment up. > > + > > + oidcpy(&ref->old_oid, &old_oid); > > + **list = ref; > > + *list = &ref->next; > > + > > + for (; i < line_sections.nr; i++) { > > + const char *arg = line_sections.items[i].string; > > + if (skip_prefix(arg, "symref-target:", &arg)) > > + ref->symref = xstrdup(arg); > > Using space-delimited fields in a single pkt-line means that > - values cannot contains a space > - total length is limited by the size of a pkt-line > > Given the context, I think that's fine. More generally it is tempting > to use a pkt-line per field to avoid the trouble v1 had with > capability lists crammed into a pkt-line, but I see why you used a > pkt-line per ref to avoid having to have sections-within-a-section. > > My only potential worry is the length part: do we have an explicit > limit on the length of a ref name? git-check-ref-format(1) doesn't > mention one. A 32k ref name would be a bit ridiculous, though. Yeah I think we're fine for now, mostly because we're out of luck with the current protocol as it is. > > > + > > + if (skip_prefix(arg, "peeled:", &arg)) { > > + struct object_id peeled_oid; > > + char *peeled_name; > > + struct ref *peeled; > > + if (get_oid_hex(arg, &peeled_oid)) { > > + ret = 0; > > + goto out; > > + } > > Can this also check that there's no trailing garbage after the oid? Yeah I do that. > > > + > > + packet_delim(fd_out); > > + /* When pushing we don't want to request the peeled tags */ > > Can you say more about this? In theory it would be nice to have the > peeled tags since they name commits whose history can be excluded from > the pack. I don't believe peeled refs are sent now in v0 for push. > > > + if (!for_push) > > + packet_write_fmt(fd_out, "peel\n"); > > + packet_write_fmt(fd_out, "symrefs\n"); > > Are symrefs useful during push? They may be at a later point in time when you want to update a symref :) > > > + for (i = 0; ref_patterns && i < ref_patterns->argc; i++) { > > + packet_write_fmt(fd_out, "ref-pattern %s\n", > > + ref_patterns->argv[i]); > > + } > > The exciting part. > > Why do these pkts end with \n? I would have expected the pkt-line > framing to work to delimit them. All pkts end with \n, that's just hows its been since v0. Though the server isn't supposed to complain if they don't contain newlines. > > > + packet_flush(fd_out); > > + > > + /* Process response from server */ > > + while (packet_reader_read(reader) == PACKET_READ_NORMAL) { > > + if (!process_ref_v2(reader->line, &list)) > > + die("invalid ls-refs response: %s", reader->line); > > + } > > + > > + if (reader->status != PACKET_READ_FLUSH) > > + die("protocol error"); > > Can this protocol error give more detail? When diagnosing an error in > servers, proxies, or lower-level networking issues, informative protocol > errors can be very helpful (similar to syntax errors from a compiler). I'll update the error msg. > [...] > > --- a/remote.h > > +++ b/remote.h > > @@ -151,10 +151,14 @@ void free_refs(struct ref *ref); > > > > struct oid_array; > > struct packet_reader; > > +struct argv_array; > > extern struct ref **get_remote_heads(struct packet_reader *reader, > > struct ref **list, unsigned int flags, > > struct oid_array *extra_have, > > struct oid_array *shallow_points); > > +extern struct ref **get_remote_refs(int fd_out, struct packet_reader *reader, > > + struct ref **list, int for_push, > > + const struct argv_array *ref_patterns); > > What is the difference between get_remote_heads and get_remote_refs? > A comment might help. (BTW, thanks for making the new saner name to > replace get_remote_heads!) I'll add a comment saying its used in v2 to retrieve a list of refs from the remote. -- Brandon Williams