> On 03 Aug 2017, at 10:18, Christian Couder <christian.couder@xxxxxxxxx> wrote: > > Let's add an odb_helper_init() function to send an 'init' > instruction to the helpers. This 'init' instruction is > especially useful to get the capabilities that are supported > by the helpers. > > So while at it, let's also add a parse_capabilities() > function to parse them and a supported_capabilities > variable in struct odb_helper to store them. > > Signed-off-by: Christian Couder <chriscool@xxxxxxxxxxxxx> > --- > ... > > +static void parse_capabilities(char *cap_buf, > + unsigned int *supported_capabilities, > + const char *process_name) > +{ > + struct string_list cap_list = STRING_LIST_INIT_NODUP; > + > + string_list_split_in_place(&cap_list, cap_buf, '=', 1); > + > + if (cap_list.nr == 2 && !strcmp(cap_list.items[0].string, "capability")) { > + const char *cap_name = cap_list.items[1].string; > + > + if (!strcmp(cap_name, "get_git_obj")) { > + *supported_capabilities |= ODB_HELPER_CAP_GET_GIT_OBJ; > + } else if (!strcmp(cap_name, "get_raw_obj")) { > + *supported_capabilities |= ODB_HELPER_CAP_GET_RAW_OBJ; > + } else if (!strcmp(cap_name, "get_direct")) { > + *supported_capabilities |= ODB_HELPER_CAP_GET_DIRECT; > + } else if (!strcmp(cap_name, "put_git_obj")) { > + *supported_capabilities |= ODB_HELPER_CAP_PUT_GIT_OBJ; > + } else if (!strcmp(cap_name, "put_raw_obj")) { > + *supported_capabilities |= ODB_HELPER_CAP_PUT_RAW_OBJ; > + } else if (!strcmp(cap_name, "put_direct")) { > + *supported_capabilities |= ODB_HELPER_CAP_PUT_DIRECT; > + } else if (!strcmp(cap_name, "have")) { > + *supported_capabilities |= ODB_HELPER_CAP_HAVE; > + } else { > + warning("external process '%s' requested unsupported read-object capability '%s'", > + process_name, cap_name); > + } In 1514c8ed ("convert: refactor capabilities negotiation", 2017-06-30) I introduced a simpler version of the capabilities negotiation. Maybe useful for you here, too? - Lars