Re: [PATCH GSoC v18 11/13] cat-file: add remote-object-info to batch-command
- From
Karthik Nayak <karthik.188@gmail.com>
- Date
- Jul 15, 2026, 22:27 UTC
- Message-ID
- <CAOLa=ZSzgsxA0ysJ6hMv9OJNVHco0YHmwQWwirD0ZTDJKMSWfQ@mail.gmail.com>
- In-Reply-To
- <20260715-ps-eric-work-rebase-v18-11-34d7adb051bb@gmail.com>
Pablo Sabater <pabloosabaterr@gmail.com> writes:
Show 36 quoted lines
> diff --git a/Documentation/git-cat-file.adoc b/Documentation/git-cat-file.adoc > index 86b9181599..a7fa6674c3 100644 > --- a/Documentation/git-cat-file.adoc > +++ b/Documentation/git-cat-file.adoc > @@ -169,6 +169,13 @@ info <object>:: > Print object info for object reference `<object>`. This corresponds to the > output of `--batch-check`. > > +remote-object-info <remote> <object>...:: > + Print object info for object references `<object>` at specified > + `<remote>` without downloading objects from the remote. > + Raise an error when the `object-info` capability is not supported by the remote. > + Raise an error when no object references are provided. > + This command may be combined with `--buffer`. > + > flush:: > Used with `--buffer` to execute all preceding commands that were issued > since the beginning or since the last flush was issued. When `--buffer` > @@ -301,7 +308,8 @@ one per line, and print information based on the command given. With > `--batch-command`, the `info` command followed by an object will print > information about the object the same way `--batch-check` would, and the > `contents` command followed by an object prints contents in the same way > -`--batch` would. > +`--batch` would. The `remote-object-info` command followed by a remote and > +objects IDs prints object info from the remote without downloading the objects. > > You can specify the information shown for each object by using a custom > `<format>`. The `<format>` is copied literally to stdout for each > @@ -324,15 +332,12 @@ newline. The available atoms are: > reports). > > `objectsize:disk`:: > - The size, in bytes, that the object takes up on disk. See the > - note about on-disk sizes in the `CAVEATS` section below. > + The size, in bytes, that the object takes up on disk. >
Why did we remove the second sentence here? Cause the caveat still exists and holds good.
Show 7 quoted lines
> `deltabase`:: > If the object is stored as a delta on-disk, this expands to the > full hex representation of the delta base object name. > - Otherwise, expands to the null OID (all zeroes). See `CAVEATS` > - below. > - > + Otherwise, expands to the null OID (all zeroes).
We also remove the newline here...
Show 32 quoted lines
> `rest`:: > If this atom is used in the output string, input lines are split > at the first whitespace boundary. All characters before that > @@ -340,8 +345,14 @@ newline. The available atoms are: > after that first run of whitespace (i.e., the "rest" of the > line) are output in place of the `%(rest)` atom. > > +The command `remote-object-info` only supports the `%(objectname)` and > +`%(objectsize)` placeholders. See `CAVEATS` below for more information. > + > If no format is specified, the default format is `%(objectname) > -%(objecttype) %(objectsize)`. > +%(objecttype) %(objectsize)`, except for `remote-object-info` commands which > +use `%(objectname) %(objectsize)` because "%(objecttype)" is not supported yet. > +WARNING: When "%(objecttype)" is supported, the default format WILL be unified, > +so DO NOT RELY on the current default format to stay the same!!! > > If `--batch` is specified, or if `--batch-command` is used with the `contents` > command, the object information is followed by the object contents (consisting > @@ -438,6 +449,10 @@ scripting purposes. > CAVEATS > ------- > > +Note that since only `%(objectname)` and `%(objectsize)` are currently > +supported by the `remote-object-info` command. Using any other placeholder in > +the format string will raise an error. > + > Note that the sizes of objects on disk are reported accurately, but care > should be taken in drawing conclusions about which refs or objects are > responsible for disk usage. The size of a packed non-delta object may > be >
[snip]
Show 17 quoted lines
> +static void parse_cmd_remote_object_info(struct batch_options *opt,
> + const char *line, struct strbuf *output,
> + struct expand_data *data)
> +{
> + int count;
> + const char **argv;
> + char *line_to_split;
> + struct object_info *remote_object_info = NULL;
> + struct oid_array object_info_oids = OID_ARRAY_INIT;
> +
> + if (strlen(line) >= MAX_REMOTE_OBJ_INFO_LINE)
> + die(_("remote-object-info command too long"));
> +
> + line_to_split = xstrdup(line);
> + count = split_cmdline(line_to_split, &argv);
> + if (count < 0)
> + die(_("remote-object-info: %s"), split_cmdline_strerror(count));Nit: Should we provide some context here? Otherwise no point being marked for translation?
Show 45 quoted lines
> + if (count - 1 > MAX_ALLOWED_OBJ_LIMIT)
> + die(_("remote-object-info supports at most %d objects"),
> + MAX_ALLOWED_OBJ_LIMIT);
> +
> + if (get_remote_info(opt, count, argv, &remote_object_info,
> + &object_info_oids))
> + goto cleanup;
> +
> + data->skip_object_info = 1;
> + for (size_t i = 0; i < object_info_oids.nr; i++) {
> + data->oid = object_info_oids.oid[i];
> + if (remote_object_info[i].sizep) {
> + /*
> + * When reaching here, it means remote-object-info can retrieve
> + * information from server without downloading them.
> + */
> + data->size = *remote_object_info[i].sizep;
> + opt->batch_mode = BATCH_MODE_INFO;
> + batch_object_write(argv[i + 1], output, opt, data, NULL, 0);
> + } else {
> + report_object_status(opt, oid_to_hex(&data->oid), &data->oid, "missing");
> + }
> + }
> + data->skip_object_info = 0;
> +
> +cleanup:
> + for (size_t i = 0; i < object_info_oids.nr; i++)
> + free_object_info_contents(&remote_object_info[i]);
> + free(line_to_split);
> + free(argv);
> + free(remote_object_info);
> + oid_array_clear(&object_info_oids);
> +}
> +
> static void dispatch_calls(struct batch_options *opt,
> struct strbuf *output,
> struct expand_data *data,
> @@ -748,8 +889,9 @@ static const struct parse_cmd {
> } commands[] = {
> { "contents", parse_cmd_contents, 1 },
> { "info", parse_cmd_info, 1 },
> - { "flush", NULL, 0 },
> { "mailmap", parse_cmd_mailmap, 1 },
> + { "remote-object-info", parse_cmd_remote_object_info, 1 },
> + { "flush", NULL, 0 },Why do we move this? we remove the alphabetical ordering by doing s
Show 21 quoted lines
> };
>
> static void batch_objects_command(struct batch_options *opt,
> diff --git a/object-file.c b/object-file.c
> index 6453b1d6fa..07f019a0f6 100644
> --- a/object-file.c
> +++ b/object-file.c
> @@ -1694,3 +1694,13 @@ struct odb_transaction *odb_transaction_files_begin(struct odb_source *source)
>
> return &transaction->base;
> }
> +
> +void free_object_info_contents(struct object_info *object_info)
> +{
> + if (!object_info)
> + return;
> + free(object_info->typep);
> + free(object_info->sizep);
> + free(object_info->disk_sizep);
> + free(object_info->delta_base_oid);
> +}[snip]