From: Chandra Pratap Date: Sun, 21 Jun 2026 06:01:16 GMT Subject: Re: [PATCH GSoC RFC v13 10/12] cat-file: add remote-object-info to batch-command Message-ID: In-Reply-To: <20260619-ps-eric-work-rebase-v13-10-3d4c7315d2f8@gmail.com> [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; > + static struct object_info *remote_object_info; > + static struct oid_array object_info_oids = OID_ARRAY_INIT; I don't get the point of remote_object_info and object_info_oids being static here? These variables are allocated, utilized, and completely freed/disconnected within a single command cycle. Making them static gives me the false impression that state needs to persist between calls. > + 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(_("split remote-object-info command")); > + 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); > +} > + [snip]