Re: [PATCH v8 5/6] transport: add client support for object-info

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Jan 7, 2025 at 1:31 PM Calvin Wan <calvinwan@xxxxxxxxxx> wrote:
>
> Thanks for picking up this series btw!
>
> On Mon, Dec 23, 2024 at 3:25 PM Eric Ju <eric.peijian@xxxxxxxxx> wrote:
> >
> > From: Calvin Wan <calvinwan@xxxxxxxxxx>
> >
> > Sometimes, it is beneficial to retrieve information about an object
> > without downloading it entirely. The server-side logic for this
> > functionality was implemented in commit "a2ba162cda (object-info:
> > support for retrieving object info, 2021-04-20)."
> >
> > This commit introduces client functions to interact with the server.
> >
> > Currently, the client supports requesting a list of object IDs with
> > the ‘size’ feature from a v2 server. If the server does not advertise
> > this feature (i.e., transfer.advertiseobjectinfo is set to false),
> > the client will return an error and exit.
> >
> > Helped-by: Jonathan Tan <jonathantanmy@xxxxxxxxxx>
> > Helped-by: Christian Couder <chriscool@xxxxxxxxxxxxx>
> > Signed-off-by: Calvin Wan <calvinwan@xxxxxxxxxx>
> > Signed-off-by: Eric Ju  <eric.peijian@xxxxxxxxx>
> > ---
> >  Makefile            |  1 +
> >  fetch-object-info.c | 92 +++++++++++++++++++++++++++++++++++++++++++++
> >  fetch-object-info.h | 18 +++++++++
> >  fetch-pack.c        |  3 ++
> >  fetch-pack.h        |  2 +
> >  transport-helper.c  | 11 +++++-
> >  transport.c         | 28 +++++++++++++-
> >  transport.h         | 11 ++++++
> >  8 files changed, 163 insertions(+), 3 deletions(-)
> >  create mode 100644 fetch-object-info.c
> >  create mode 100644 fetch-object-info.h
> >
> > diff --git a/Makefile b/Makefile
> > index 3fa4bf0d06..70e9ec0464 100644
> > --- a/Makefile
> > +++ b/Makefile
> > @@ -1020,6 +1020,7 @@ LIB_OBJS += ewah/ewah_rlw.o
> >  LIB_OBJS += exec-cmd.o
> >  LIB_OBJS += fetch-negotiator.o
> >  LIB_OBJS += fetch-pack.o
> > +LIB_OBJS += fetch-object-info.o
> >  LIB_OBJS += fmt-merge-msg.o
> >  LIB_OBJS += fsck.o
> >  LIB_OBJS += fsmonitor.o
> > diff --git a/fetch-object-info.c b/fetch-object-info.c
> > new file mode 100644
> > index 0000000000..2aa9f2b70d
> > --- /dev/null
> > +++ b/fetch-object-info.c
> > @@ -0,0 +1,92 @@
> > +#include "git-compat-util.h"
> > +#include "gettext.h"
> > +#include "hex.h"
> > +#include "pkt-line.h"
> > +#include "connect.h"
> > +#include "oid-array.h"
> > +#include "object-store-ll.h"
> > +#include "fetch-object-info.h"
> > +#include "string-list.h"
> > +
> > +/**
> > + * send_object_info_request sends git-cat-file object-info command and its
> > + * arguments into the request buffer.
> > + */
> > +static void send_object_info_request(const int fd_out, struct object_info_args *args)
> > +{
> > +       struct strbuf req_buf = STRBUF_INIT;
> > +
> > +       write_command_and_capabilities(&req_buf, "object-info", args->server_options);
> > +
> > +       if (unsorted_string_list_has_string(args->object_info_options, "size"))
> > +               packet_buf_write(&req_buf, "size");
> > +
> > +       if (args->oids) {
> > +               for (size_t i = 0; i < args->oids->nr; i++)
> > +                       packet_buf_write(&req_buf, "oid %s", oid_to_hex(&args->oids->oid[i]));
> > +       }
> > +
> > +       packet_buf_flush(&req_buf);
> > +       if (write_in_full(fd_out, req_buf.buf, req_buf.len) < 0)
> > +               die_errno(_("unable to write request to remote"));
> > +
> > +       strbuf_release(&req_buf);
> > +}
> > +
> > +/**
> > + * fetch_object_info sends git-cat-file object-info command into the request buf
> > + * and read the results from packets.
> > + */
> > +int fetch_object_info(const enum protocol_version version, struct object_info_args *args,
> > +                     struct packet_reader *reader, struct object_info *object_info_data,
> > +                     const int stateless_rpc, const int fd_out)
> > +{
> > +       int size_index = -1;
> > +
> > +       switch (version) {
> > +       case protocol_v2:
> > +               if (!server_supports_v2("object-info"))
> > +                       die(_("object-info capability is not enabled on the server"));
> > +               send_object_info_request(fd_out, args);
> > +               break;
> > +       case protocol_v1:
> > +       case protocol_v0:
> > +               die(_("wrong protocol version. expected v2"));
>
> s/wrong/unsupported
>

Thank you. Fixing it in v9.

> > +       case protocol_unknown_version:
> > +               BUG("unknown protocol version");
> > +       }
> > +
> > +       for (size_t i = 0; i < args->object_info_options->nr; i++) {
> > +               if (packet_reader_read(reader) != PACKET_READ_NORMAL) {
> > +                       check_stateless_delimiter(stateless_rpc, reader, "stateless delimiter expected");
> > +                       return -1;
> > +               }
> > +               if (unsorted_string_list_has_string(args->object_info_options, reader->line)) {
> > +                       if (!strcmp(reader->line, "size")) {
> > +                               size_index = i;
> > +                               for (size_t j = 0; j < args->oids->nr; j++)
> > +                                       object_info_data[j].sizep = xcalloc(1, sizeof(long));
> > +                       }
> > +                       continue;
> > +               }
> > +               return -1;
> > +       }
>
> I think we can flatten this logic a bit more here to make it more intuitive.
>
> if (!unsorted_string_list_has_string(args->object_info_options, reader->line))
>         return -1;
> if (!strcmp(reader->line, "size")) {
>         size_index = i;
>         for (size_t j = 0; j < args->oids->nr; j++)
>                 object_info_data[j].sizep = xcalloc(1, sizeof(long));
> }

Thank you. Revising it in v9.





[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux