mirror of
https://github.com/git/git.git
synced 2025-12-12 20:36:24 +01:00
fetch-pack: refactor packet writing
Refactor write_fetch_command_and_capabilities() to be a more general purpose function write_command_and_capabilities(), so that it can be used by both fetch and future commands. Here "command" means the "operations" supported by Git’s wire protocol https://git-scm.com/docs/protocol-v2. An example would be a git's subcommand, such as git-fetch(1); or an operation supported by the server side such as "object-info" implemented in "a2ba162cda (object-info: support for retrieving object info, 2021-04-20)". The new write_command_and_capabilities() function is also moved to connect.c, so that it becomes accessible to other commands. Helped-by: Jonathan Tan <jonathantanmy@google.com> Helped-by: Christian Couder <chriscool@tuxfamily.org> Signed-off-by: Calvin Wan <calvinwan@google.com> Signed-off-by: Eric Ju <eric.peijian@gmail.com> Signed-off-by: Taylor Blau <me@ttaylorr.com>
This commit is contained in:
34
connect.c
34
connect.c
@@ -688,6 +688,40 @@ int server_supports(const char *feature)
|
|||||||
return !!server_feature_value(feature, NULL);
|
return !!server_feature_value(feature, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void write_command_and_capabilities(struct strbuf *req_buf, const char *command,
|
||||||
|
const struct string_list *server_options)
|
||||||
|
{
|
||||||
|
const char *hash_name;
|
||||||
|
int advertise_sid;
|
||||||
|
|
||||||
|
git_config_get_bool("transfer.advertisesid", &advertise_sid);
|
||||||
|
|
||||||
|
ensure_server_supports_v2(command);
|
||||||
|
packet_buf_write(req_buf, "command=%s", command);
|
||||||
|
if (server_supports_v2("agent"))
|
||||||
|
packet_buf_write(req_buf, "agent=%s", git_user_agent_sanitized());
|
||||||
|
if (advertise_sid && server_supports_v2("session-id"))
|
||||||
|
packet_buf_write(req_buf, "session-id=%s", trace2_session_id());
|
||||||
|
if (server_options && server_options->nr) {
|
||||||
|
ensure_server_supports_v2("server-option");
|
||||||
|
for (int i = 0; i < server_options->nr; i++)
|
||||||
|
packet_buf_write(req_buf, "server-option=%s",
|
||||||
|
server_options->items[i].string);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (server_feature_v2("object-format", &hash_name)) {
|
||||||
|
const int hash_algo = hash_algo_by_name(hash_name);
|
||||||
|
if (hash_algo_by_ptr(the_hash_algo) != hash_algo)
|
||||||
|
die(_("mismatched algorithms: client %s; server %s"),
|
||||||
|
the_hash_algo->name, hash_name);
|
||||||
|
packet_buf_write(req_buf, "object-format=%s", the_hash_algo->name);
|
||||||
|
} else if (hash_algo_by_ptr(the_hash_algo) != GIT_HASH_SHA1) {
|
||||||
|
die(_("the server does not support algorithm '%s'"),
|
||||||
|
the_hash_algo->name);
|
||||||
|
}
|
||||||
|
packet_buf_delim(req_buf);
|
||||||
|
}
|
||||||
|
|
||||||
enum protocol {
|
enum protocol {
|
||||||
PROTO_LOCAL = 1,
|
PROTO_LOCAL = 1,
|
||||||
PROTO_FILE,
|
PROTO_FILE,
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#ifndef CONNECT_H
|
#ifndef CONNECT_H
|
||||||
#define CONNECT_H
|
#define CONNECT_H
|
||||||
|
|
||||||
|
#include "string-list.h"
|
||||||
#include "protocol.h"
|
#include "protocol.h"
|
||||||
|
|
||||||
#define CONNECT_VERBOSE (1u << 0)
|
#define CONNECT_VERBOSE (1u << 0)
|
||||||
@@ -30,4 +31,7 @@ void check_stateless_delimiter(int stateless_rpc,
|
|||||||
struct packet_reader *reader,
|
struct packet_reader *reader,
|
||||||
const char *error);
|
const char *error);
|
||||||
|
|
||||||
|
void write_command_and_capabilities(struct strbuf *req_buf, const char *command,
|
||||||
|
const struct string_list *server_options);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
36
fetch-pack.c
36
fetch-pack.c
@@ -1314,38 +1314,6 @@ static int add_haves(struct fetch_negotiator *negotiator,
|
|||||||
return haves_added;
|
return haves_added;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void write_fetch_command_and_capabilities(struct strbuf *req_buf,
|
|
||||||
const struct string_list *server_options)
|
|
||||||
{
|
|
||||||
const char *hash_name;
|
|
||||||
|
|
||||||
ensure_server_supports_v2("fetch");
|
|
||||||
packet_buf_write(req_buf, "command=fetch");
|
|
||||||
if (server_supports_v2("agent"))
|
|
||||||
packet_buf_write(req_buf, "agent=%s", git_user_agent_sanitized());
|
|
||||||
if (advertise_sid && server_supports_v2("session-id"))
|
|
||||||
packet_buf_write(req_buf, "session-id=%s", trace2_session_id());
|
|
||||||
if (server_options && server_options->nr) {
|
|
||||||
int i;
|
|
||||||
ensure_server_supports_v2("server-option");
|
|
||||||
for (i = 0; i < server_options->nr; i++)
|
|
||||||
packet_buf_write(req_buf, "server-option=%s",
|
|
||||||
server_options->items[i].string);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (server_feature_v2("object-format", &hash_name)) {
|
|
||||||
int hash_algo = hash_algo_by_name(hash_name);
|
|
||||||
if (hash_algo_by_ptr(the_hash_algo) != hash_algo)
|
|
||||||
die(_("mismatched algorithms: client %s; server %s"),
|
|
||||||
the_hash_algo->name, hash_name);
|
|
||||||
packet_buf_write(req_buf, "object-format=%s", the_hash_algo->name);
|
|
||||||
} else if (hash_algo_by_ptr(the_hash_algo) != GIT_HASH_SHA1) {
|
|
||||||
die(_("the server does not support algorithm '%s'"),
|
|
||||||
the_hash_algo->name);
|
|
||||||
}
|
|
||||||
packet_buf_delim(req_buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int send_fetch_request(struct fetch_negotiator *negotiator, int fd_out,
|
static int send_fetch_request(struct fetch_negotiator *negotiator, int fd_out,
|
||||||
struct fetch_pack_args *args,
|
struct fetch_pack_args *args,
|
||||||
const struct ref *wants, struct oidset *common,
|
const struct ref *wants, struct oidset *common,
|
||||||
@@ -1356,7 +1324,7 @@ static int send_fetch_request(struct fetch_negotiator *negotiator, int fd_out,
|
|||||||
int done_sent = 0;
|
int done_sent = 0;
|
||||||
struct strbuf req_buf = STRBUF_INIT;
|
struct strbuf req_buf = STRBUF_INIT;
|
||||||
|
|
||||||
write_fetch_command_and_capabilities(&req_buf, args->server_options);
|
write_command_and_capabilities(&req_buf, "fetch", args->server_options);
|
||||||
|
|
||||||
if (args->use_thin_pack)
|
if (args->use_thin_pack)
|
||||||
packet_buf_write(&req_buf, "thin-pack");
|
packet_buf_write(&req_buf, "thin-pack");
|
||||||
@@ -2174,7 +2142,7 @@ void negotiate_using_fetch(const struct oid_array *negotiation_tips,
|
|||||||
the_repository, "%d",
|
the_repository, "%d",
|
||||||
negotiation_round);
|
negotiation_round);
|
||||||
strbuf_reset(&req_buf);
|
strbuf_reset(&req_buf);
|
||||||
write_fetch_command_and_capabilities(&req_buf, server_options);
|
write_command_and_capabilities(&req_buf, "fetch", server_options);
|
||||||
|
|
||||||
packet_buf_write(&req_buf, "wait-for-done");
|
packet_buf_write(&req_buf, "wait-for-done");
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user