protocol-caps: add type support to object-info
Teach the server-side object-info handler to accept type as a requested field. When the client includes type in its object-info request, the server returns the requested object type. While touching send_info(), wrap an over-long line and fix the bit field style of requested_info.size. Mentored-by: Karthik Nayak <karthik.188@gmail.com> Mentored-by: Chandra Pratap <chandrapratap3519@gmail.com> Signed-off-by: Pablo Sabater <pabloosabaterr@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>main
parent
567e62b1b9
commit
7692fa9019
|
|
@ -11,7 +11,8 @@
|
||||||
#include "strbuf.h"
|
#include "strbuf.h"
|
||||||
|
|
||||||
struct requested_info {
|
struct requested_info {
|
||||||
unsigned size : 1;
|
unsigned size:1;
|
||||||
|
unsigned type:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -73,15 +74,20 @@ static void send_info(struct repository *r, struct packet_writer *writer,
|
||||||
if (info->size)
|
if (info->size)
|
||||||
packet_writer_write(writer, "size");
|
packet_writer_write(writer, "size");
|
||||||
|
|
||||||
|
if (info->type)
|
||||||
|
packet_writer_write(writer, "type");
|
||||||
|
|
||||||
for_each_string_list_item (item, oid_str_list) {
|
for_each_string_list_item (item, oid_str_list) {
|
||||||
const char *oid_str = item->string;
|
const char *oid_str = item->string;
|
||||||
|
enum object_type object_type;
|
||||||
struct object_id oid;
|
struct object_id oid;
|
||||||
size_t object_size;
|
size_t object_size;
|
||||||
|
|
||||||
if (get_oid_hex_algop(oid_str, &oid, r->hash_algo) < 0) {
|
if (get_oid_hex_algop(oid_str, &oid, r->hash_algo) < 0) {
|
||||||
packet_writer_error(
|
packet_writer_error(
|
||||||
writer,
|
writer,
|
||||||
"object-info: protocol error, expected to get oid, not '%s'",
|
"object-info: protocol error, expected to get "
|
||||||
|
"oid, not '%s'",
|
||||||
oid_str);
|
oid_str);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
@ -93,7 +99,8 @@ static void send_info(struct repository *r, struct packet_writer *writer,
|
||||||
* If an object is not recognized by the server append SP to
|
* If an object is not recognized by the server append SP to
|
||||||
* the response.
|
* the response.
|
||||||
*/
|
*/
|
||||||
if (get_object_info(r->objects, &oid, &object_size) <= OBJ_NONE) {
|
object_type = get_object_info(r->objects, &oid, &object_size);
|
||||||
|
if (object_type <= OBJ_NONE) {
|
||||||
strbuf_addstr(&send_buffer, " ");
|
strbuf_addstr(&send_buffer, " ");
|
||||||
goto write;
|
goto write;
|
||||||
}
|
}
|
||||||
|
|
@ -103,6 +110,9 @@ static void send_info(struct repository *r, struct packet_writer *writer,
|
||||||
(uintmax_t)object_size);
|
(uintmax_t)object_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (info->type)
|
||||||
|
strbuf_addf(&send_buffer, " %s", type_name(object_type));
|
||||||
|
|
||||||
write:
|
write:
|
||||||
packet_writer_write(writer, "%s", send_buffer.buf);
|
packet_writer_write(writer, "%s", send_buffer.buf);
|
||||||
strbuf_reset(&send_buffer);
|
strbuf_reset(&send_buffer);
|
||||||
|
|
@ -124,6 +134,11 @@ int cap_object_info(struct repository *r, struct packet_reader *request)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!strcmp("type", request->line)) {
|
||||||
|
info.type = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (parse_oid(request->line, &oid_str_list))
|
if (parse_oid(request->line, &oid_str_list))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -369,6 +369,36 @@ test_expect_success 'basics of object-info' '
|
||||||
test_cmp expect actual
|
test_cmp expect actual
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'object-info supports type' '
|
||||||
|
test_config transfer.advertiseObjectInfo true &&
|
||||||
|
|
||||||
|
two_oid=$(git rev-parse two:two.t) &&
|
||||||
|
two_size=$(test_file_size two.t) &&
|
||||||
|
|
||||||
|
test-tool pkt-line pack >in <<-EOF &&
|
||||||
|
command=object-info
|
||||||
|
object-format=$(test_oid algo)
|
||||||
|
0001
|
||||||
|
size
|
||||||
|
type
|
||||||
|
oid $two_oid
|
||||||
|
oid $two_oid
|
||||||
|
0000
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat >expect <<-EOF &&
|
||||||
|
size
|
||||||
|
type
|
||||||
|
$two_oid $two_size blob
|
||||||
|
$two_oid $two_size blob
|
||||||
|
0000
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test-tool serve-v2 --stateless-rpc <in >out &&
|
||||||
|
test-tool pkt-line unpack <out >actual &&
|
||||||
|
test_cmp expect actual
|
||||||
|
'
|
||||||
|
|
||||||
test_expect_success 'bare OID request' '
|
test_expect_success 'bare OID request' '
|
||||||
test_config transfer.advertiseObjectInfo true &&
|
test_config transfer.advertiseObjectInfo true &&
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue