1 #include "git-compat-util.h"
2 #include "protocol-caps.h"
8 #include "object-store.h"
9 #include "string-list.h"
12 struct requested_info
{
17 * Parses oids from the given line and collects them in the given
18 * oid_str_list. Returns 1 if parsing was successful and 0 otherwise.
20 static int parse_oid(const char *line
, struct string_list
*oid_str_list
)
24 if (!skip_prefix(line
, "oid ", &arg
))
27 string_list_append(oid_str_list
, arg
);
33 * Validates and send requested info back to the client. Any errors detected
34 * are returned as they are detected.
36 static void send_info(struct repository
*r
, struct packet_writer
*writer
,
37 struct string_list
*oid_str_list
,
38 struct requested_info
*info
)
40 struct string_list_item
*item
;
41 struct strbuf send_buffer
= STRBUF_INIT
;
43 if (!oid_str_list
->nr
)
47 packet_writer_write(writer
, "size");
49 for_each_string_list_item (item
, oid_str_list
) {
50 const char *oid_str
= item
->string
;
52 unsigned long object_size
;
54 if (get_oid_hex(oid_str
, &oid
) < 0) {
57 "object-info: protocol error, expected to get oid, not '%s'",
62 strbuf_addstr(&send_buffer
, oid_str
);
65 if (oid_object_info(r
, &oid
, &object_size
) < 0) {
66 strbuf_addstr(&send_buffer
, " ");
68 strbuf_addf(&send_buffer
, " %lu", object_size
);
72 packet_writer_write(writer
, "%s", send_buffer
.buf
);
73 strbuf_reset(&send_buffer
);
75 strbuf_release(&send_buffer
);
78 int cap_object_info(struct repository
*r
, struct packet_reader
*request
)
80 struct requested_info info
;
81 struct packet_writer writer
;
82 struct string_list oid_str_list
= STRING_LIST_INIT_DUP
;
84 packet_writer_init(&writer
, 1);
86 while (packet_reader_read(request
) == PACKET_READ_NORMAL
) {
87 if (!strcmp("size", request
->line
)) {
92 if (parse_oid(request
->line
, &oid_str_list
))
95 packet_writer_error(&writer
,
96 "object-info: unexpected line: '%s'",
100 if (request
->status
!= PACKET_READ_FLUSH
) {
102 &writer
, "object-info: expected flush after arguments");
103 die(_("object-info: expected flush after arguments"));
106 send_info(r
, &writer
, &oid_str_list
, &info
);
108 string_list_clear(&oid_str_list
, 1);