mirror of
https://github.com/git/git.git
synced 2026-08-08 17:11:48 +00:00
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>
This commit is contained in:
committed by
Junio C Hamano
parent
1157343e48
commit
b6562f2927
@@ -11,7 +11,8 @@
|
||||
#include "strbuf.h"
|
||||
|
||||
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)
|
||||
packet_writer_write(writer, "size");
|
||||
|
||||
if (info->type)
|
||||
packet_writer_write(writer, "type");
|
||||
|
||||
for_each_string_list_item (item, oid_str_list) {
|
||||
const char *oid_str = item->string;
|
||||
enum object_type object_type;
|
||||
struct object_id oid;
|
||||
size_t object_size;
|
||||
|
||||
if (get_oid_hex_algop(oid_str, &oid, r->hash_algo) < 0) {
|
||||
packet_writer_error(
|
||||
writer,
|
||||
"object-info: protocol error, expected to get oid, not '%s'",
|
||||
"object-info: protocol error, expected to get "
|
||||
"oid, not '%s'",
|
||||
oid_str);
|
||||
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
|
||||
* 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, " ");
|
||||
goto write;
|
||||
}
|
||||
@@ -103,6 +110,9 @@ static void send_info(struct repository *r, struct packet_writer *writer,
|
||||
(uintmax_t)object_size);
|
||||
}
|
||||
|
||||
if (info->type)
|
||||
strbuf_addf(&send_buffer, " %s", type_name(object_type));
|
||||
|
||||
write:
|
||||
packet_writer_write(writer, "%s", send_buffer.buf);
|
||||
strbuf_reset(&send_buffer);
|
||||
@@ -124,6 +134,11 @@ int cap_object_info(struct repository *r, struct packet_reader *request)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!strcmp("type", request->line)) {
|
||||
info.type = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (parse_oid(request->line, &oid_str_list))
|
||||
continue;
|
||||
|
||||
|
||||
@@ -369,6 +369,36 @@ test_expect_success 'basics of object-info' '
|
||||
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_config transfer.advertiseObjectInfo true &&
|
||||
|
||||
|
||||
Reference in New Issue
Block a user