1 #include "git-compat-util.h"
2 #include "protocol-caps.h"
10 #include "object-store-ll.h"
11 #include "string-list.h"
14 struct requested_info
{
19 * Parses oids from the given line and collects them in the given
20 * oid_str_list. Returns 1 if parsing was successful and 0 otherwise.
22 static int parse_oid(const char *line
, struct string_list
*oid_str_list
)
26 if (!skip_prefix(line
, "oid ", &arg
))
29 string_list_append(oid_str_list
, arg
);
35 * Validates and send requested info back to the client. Any errors detected
36 * are returned as they are detected.
38 static void send_info(struct repository
*r
, struct packet_writer
*writer
,
39 struct string_list
*oid_str_list
,
40 struct requested_info
*info
)
42 struct string_list_item
*item
;
43 struct strbuf send_buffer
= STRBUF_INIT
;
45 if (!oid_str_list
->nr
)
49 packet_writer_write(writer
, "size");
51 for_each_string_list_item (item
, oid_str_list
) {
52 const char *oid_str
= item
->string
;
54 unsigned long object_size
;
56 if (get_oid_hex(oid_str
, &oid
) < 0) {
59 "object-info: protocol error, expected to get oid, not '%s'",
64 strbuf_addstr(&send_buffer
, oid_str
);
67 if (oid_object_info(r
, &oid
, &object_size
) < 0) {
68 strbuf_addstr(&send_buffer
, " ");
70 strbuf_addf(&send_buffer
, " %lu", object_size
);
74 packet_writer_write(writer
, "%s", send_buffer
.buf
);
75 strbuf_reset(&send_buffer
);
77 strbuf_release(&send_buffer
);
80 int cap_object_info(struct repository
*r
, struct packet_reader
*request
)
82 struct requested_info info
= { 0 };
83 struct packet_writer writer
;
84 struct string_list oid_str_list
= STRING_LIST_INIT_DUP
;
86 packet_writer_init(&writer
, 1);
88 while (packet_reader_read(request
) == PACKET_READ_NORMAL
) {
89 if (!strcmp("size", request
->line
)) {
94 if (parse_oid(request
->line
, &oid_str_list
))
97 packet_writer_error(&writer
,
98 "object-info: unexpected line: '%s'",
102 if (request
->status
!= PACKET_READ_FLUSH
) {
104 &writer
, "object-info: expected flush after arguments");
105 die(_("object-info: expected flush after arguments"));
108 send_info(r
, &writer
, &oid_str_list
, &info
);
110 string_list_clear(&oid_str_list
, 1);