On 12/07, Junio C Hamano wrote: > Brandon Williams <bmwill@xxxxxxxxxx> writes: > > > +static struct protocol_capability *get_capability(const char *key) > > +{ > > + int i; > > + > > + if (!key) > > + return NULL; > > + > > + for (i = 0; i < ARRAY_SIZE(capabilities); i++) { > > + struct protocol_capability *c = &capabilities[i]; > > + const char *out; > > + if (skip_prefix(key, c->name, &out) && (!*out || *out == '=')) > > + return c; > > Looks familiar and resembles what was recently discussed on list ;-) > > > +int cmd_serve(int argc, const char **argv, const char *prefix) > > +{ > > + > > + struct option options[] = { > > + OPT_END() > > + }; > > + > > + /* ignore all unknown cmdline switches for now */ > > + argc = parse_options(argc, argv, prefix, options, grep_usage, > > + PARSE_OPT_KEEP_DASHDASH | > > + PARSE_OPT_KEEP_UNKNOWN); > > + serve(); > > + > > + return 0; > > +} I assume that at some point we may want to have a new endpoint that just does v2 without needing the side channel to tell it to do so. Maybe for brand new server commands, like a remote grep or a remote object-stat or something that don't have a v1 equivalent that can be fallen back to. That's why I included a builtin/serve.c > > ... > > +/* Main serve loop for protocol version 2 */ > > +void serve(void) > > +{ > > + /* serve by default supports v2 */ > > + packet_write_fmt(1, "version 2\n"); > > + > > + advertise_capabilities(); > > + > > + for (;;) > > + if (process_request()) > > + break; > > +} > > I am guessing that this would be run just like upload-pack, > i.e. invoked via ssh or via git-daemon, and that is why it can just > assume that fd#0/fd#1 are already connected to the other end. It > may be helpful to document somewhere how we envision to invoke this > program. > This function I was planning to just be executed by upload-pack and receive-pack when a client requests protocol v2. But yes the idea would be that fd#0/fd#1 would be already setup like they are for upload-pack and receive-pack. -- Brandon Williams