From: Karthik Nayak Date: Wed, 15 Jul 2026 22:27:58 GMT Subject: Re: [PATCH GSoC v18 11/13] cat-file: add remote-object-info to batch-command Message-ID: In-Reply-To: <20260715-ps-eric-work-rebase-v18-11-34d7adb051bb@gmail.com> Pablo Sabater writes: > 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 :: > Print object info for object reference ``. This corresponds to the > output of `--batch-check`. > > +remote-object-info ...:: > + Print object info for object references `` at specified > + `` 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 > ``. The `` 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. > `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... > `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] > +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? > + 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 > }; > > 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]