From: Derrick Stolee <derrickstolee@xxxxxxxxxx> This method allows a client to request and parse the 'features' capability of protocol v2. The response is expected to be a list of 'key=value' lines, but this implementation does no checking of the lines, expecting a later parse of the lines to be careful of the existence of that '=' character. This change is based on an earlier patch [1] written for a similar capability. [1] https://lore.kernel.org/git/RFC-patch-04.13-21caf01775-20210805T150534Z-avarab@xxxxxxxxx/ Co-authored-by: Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> Signed-off-by: Derrick Stolee <derrickstolee@xxxxxxxxxx> --- connect.c | 36 ++++++++++++++++++++++++++++++++++++ remote.h | 4 ++++ 2 files changed, 40 insertions(+) diff --git a/connect.c b/connect.c index 9d78d681e95..e1e6f4770dd 100644 --- a/connect.c +++ b/connect.c @@ -491,6 +491,42 @@ static void send_capabilities(int fd_out, struct packet_reader *reader) } } +int get_recommended_features(int fd_out, struct packet_reader *reader, + struct string_list *list, int stateless_rpc) +{ + int line_nr = 1; + + server_supports_v2("features", 1); + + /* (Re-)send capabilities */ + send_capabilities(fd_out, reader); + + /* Send command */ + packet_write_fmt(fd_out, "command=features\n"); + packet_delim(fd_out); + packet_flush(fd_out); + + /* Process response from server */ + while (packet_reader_read(reader) == PACKET_READ_NORMAL) { + const char *line = reader->line; + line_nr++; + + string_list_append(list, line); + } + + if (reader->status != PACKET_READ_FLUSH) + return error(_("expected flush after features listing")); + + /* + * Might die(), but obscure enough that that's OK, e.g. in + * serve.c, we'll call BUG() on its equivalent (the + * PACKET_READ_RESPONSE_END check). + */ + check_stateless_delimiter(stateless_rpc, reader, + _("expected response end packet after features listing")); + return 0; +} + struct ref **get_remote_refs(int fd_out, struct packet_reader *reader, struct ref **list, int for_push, struct transport_ls_refs_options *transport_options, diff --git a/remote.h b/remote.h index 438152ef562..268e8134f5e 100644 --- a/remote.h +++ b/remote.h @@ -236,6 +236,10 @@ struct ref **get_remote_refs(int fd_out, struct packet_reader *reader, const struct string_list *server_options, int stateless_rpc); +/* Used for protocol v2 in order to retrieve recommended features */ +int get_recommended_features(int fd_out, struct packet_reader *reader, + struct string_list *list, int stateless_rpc); + int resolve_remote_symref(struct ref *ref, struct ref *list); /* -- gitgitgadget