Merge branch 'jk/connect-service-enum'
The "name" argument in git_connect() and related functions has been converted to a "service" enum to improve type safety and clarify its purpose. * jk/connect-service-enum: transport-helper: fix typo in BUG() message connect: use "service" enum for "name" argumentmain
commit
7b3ab91768
|
|
@ -31,7 +31,7 @@ static int run_remote_archiver(int argc, const char **argv,
|
|||
|
||||
_remote = remote_get(remote);
|
||||
transport = transport_get(_remote, _remote->url.v[0]);
|
||||
transport_connect(transport, "git-upload-archive", exec, fd);
|
||||
transport_connect(transport, GIT_CONNECT_UPLOAD_ARCHIVE, exec, fd);
|
||||
|
||||
/*
|
||||
* Inject a fake --format field at the beginning of the
|
||||
|
|
|
|||
|
|
@ -223,7 +223,7 @@ int cmd_fetch_pack(int argc,
|
|||
int flags = args.verbose ? CONNECT_VERBOSE : 0;
|
||||
if (args.diag_url)
|
||||
flags |= CONNECT_DIAG_URL;
|
||||
conn = git_connect(fd, dest, "git-upload-pack",
|
||||
conn = git_connect(fd, dest, GIT_CONNECT_UPLOAD_PACK,
|
||||
args.uploadpack, flags);
|
||||
if (!conn)
|
||||
return args.diag_url ? 0 : 1;
|
||||
|
|
|
|||
|
|
@ -273,8 +273,9 @@ int cmd_send_pack(int argc,
|
|||
fd[0] = 0;
|
||||
fd[1] = 1;
|
||||
} else {
|
||||
conn = git_connect(fd, dest, "git-receive-pack", receivepack,
|
||||
args.verbose ? CONNECT_VERBOSE : 0);
|
||||
conn = git_connect(fd, dest, GIT_CONNECT_RECEIVE_PACK,
|
||||
receivepack,
|
||||
args.verbose ? CONNECT_VERBOSE : 0);
|
||||
}
|
||||
|
||||
packet_reader_init(&reader, fd[0], NULL, 0,
|
||||
|
|
|
|||
|
|
@ -1399,7 +1399,7 @@ static void fill_ssh_args(struct child_process *conn, const char *ssh_host,
|
|||
* the connection failed).
|
||||
*/
|
||||
struct child_process *git_connect(int fd[2], const char *url,
|
||||
const char *name,
|
||||
enum git_connect_service service,
|
||||
const char *prog, int flags)
|
||||
{
|
||||
char *hostandport, *path;
|
||||
|
|
@ -1413,7 +1413,7 @@ struct child_process *git_connect(int fd[2], const char *url,
|
|||
* fetch, ls-remote, etc), then fallback to v0 since we don't know how
|
||||
* to do anything else (like push or remote archive) via v2.
|
||||
*/
|
||||
if (version == protocol_v2 && strcmp("git-upload-pack", name))
|
||||
if (version == protocol_v2 && service != GIT_CONNECT_UPLOAD_PACK)
|
||||
version = protocol_v0;
|
||||
|
||||
/* Without this we cannot rely on waitpid() to tell
|
||||
|
|
|
|||
|
|
@ -7,7 +7,12 @@
|
|||
#define CONNECT_DIAG_URL (1u << 1)
|
||||
#define CONNECT_IPV4 (1u << 2)
|
||||
#define CONNECT_IPV6 (1u << 3)
|
||||
struct child_process *git_connect(int fd[2], const char *url, const char *name, const char *prog, int flags);
|
||||
enum git_connect_service {
|
||||
GIT_CONNECT_UPLOAD_PACK,
|
||||
GIT_CONNECT_RECEIVE_PACK,
|
||||
GIT_CONNECT_UPLOAD_ARCHIVE,
|
||||
};
|
||||
struct child_process *git_connect(int fd[2], const char *url, enum git_connect_service, const char *prog, int flags);
|
||||
int finish_connect(struct child_process *conn);
|
||||
int git_connection_is_socket(struct child_process *conn);
|
||||
int server_supports(const char *feature);
|
||||
|
|
|
|||
|
|
@ -620,8 +620,22 @@ static int run_connect(struct transport *transport, struct strbuf *cmdbuf)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static const char *connect_service_cmd(enum git_connect_service service)
|
||||
{
|
||||
switch (service) {
|
||||
case GIT_CONNECT_UPLOAD_PACK:
|
||||
return "git-upload-pack";
|
||||
case GIT_CONNECT_RECEIVE_PACK:
|
||||
return "git-receive-pack";
|
||||
case GIT_CONNECT_UPLOAD_ARCHIVE:
|
||||
return "git-upload-archive";
|
||||
}
|
||||
BUG("unknown git_connect_service: %d", service);
|
||||
}
|
||||
|
||||
static int process_connect_service(struct transport *transport,
|
||||
const char *name, const char *exec)
|
||||
enum git_connect_service service,
|
||||
const char *exec)
|
||||
{
|
||||
struct helper_data *data = transport->data;
|
||||
struct strbuf cmdbuf = STRBUF_INIT;
|
||||
|
|
@ -631,7 +645,7 @@ static int process_connect_service(struct transport *transport,
|
|||
* Handle --upload-pack and friends. This is fire and forget...
|
||||
* just warn if it fails.
|
||||
*/
|
||||
if (strcmp(name, exec)) {
|
||||
if (strcmp(connect_service_cmd(service), exec)) {
|
||||
int r = set_helper_option(transport, "servpath", exec);
|
||||
if (r > 0)
|
||||
warning(_("setting remote service path not supported by protocol"));
|
||||
|
|
@ -640,13 +654,15 @@ static int process_connect_service(struct transport *transport,
|
|||
}
|
||||
|
||||
if (data->connect) {
|
||||
strbuf_addf(&cmdbuf, "connect %s\n", name);
|
||||
strbuf_addf(&cmdbuf, "connect %s\n",
|
||||
connect_service_cmd(service));
|
||||
ret = run_connect(transport, &cmdbuf);
|
||||
} else if (data->stateless_connect &&
|
||||
(get_protocol_version_config() == protocol_v2) &&
|
||||
(!strcmp("git-upload-pack", name) ||
|
||||
!strcmp("git-upload-archive", name))) {
|
||||
strbuf_addf(&cmdbuf, "stateless-connect %s\n", name);
|
||||
(service == GIT_CONNECT_UPLOAD_PACK ||
|
||||
service == GIT_CONNECT_UPLOAD_ARCHIVE)) {
|
||||
strbuf_addf(&cmdbuf, "stateless-connect %s\n",
|
||||
connect_service_cmd(service));
|
||||
ret = run_connect(transport, &cmdbuf);
|
||||
if (ret)
|
||||
transport->stateless_rpc = 1;
|
||||
|
|
@ -660,32 +676,33 @@ static int process_connect(struct transport *transport,
|
|||
int for_push)
|
||||
{
|
||||
struct helper_data *data = transport->data;
|
||||
const char *name;
|
||||
enum git_connect_service service;
|
||||
const char *exec;
|
||||
int ret;
|
||||
|
||||
name = for_push ? "git-receive-pack" : "git-upload-pack";
|
||||
service = for_push ? GIT_CONNECT_RECEIVE_PACK : GIT_CONNECT_UPLOAD_PACK;
|
||||
if (for_push)
|
||||
exec = data->transport_options.receivepack;
|
||||
else
|
||||
exec = data->transport_options.uploadpack;
|
||||
|
||||
ret = process_connect_service(transport, name, exec);
|
||||
ret = process_connect_service(transport, service, exec);
|
||||
if (ret)
|
||||
do_take_over(transport);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int connect_helper(struct transport *transport, const char *name,
|
||||
const char *exec, int fd[2])
|
||||
static int connect_helper(struct transport *transport, enum git_connect_service service,
|
||||
const char *exec, int fd[2])
|
||||
{
|
||||
struct helper_data *data = transport->data;
|
||||
|
||||
/* Get_helper so connect is inited. */
|
||||
get_helper(transport);
|
||||
|
||||
if (!process_connect_service(transport, name, exec))
|
||||
die(_("can't connect to subservice %s"), name);
|
||||
if (!process_connect_service(transport, service, exec))
|
||||
die(_("can't connect to subservice %s"),
|
||||
connect_service_cmd(service));
|
||||
|
||||
fd[0] = data->helper->out;
|
||||
fd[1] = data->helper->in;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,8 @@
|
|||
#ifndef TRANSPORT_INTERNAL_H
|
||||
#define TRANSPORT_INTERNAL_H
|
||||
|
||||
#include "connect.h"
|
||||
|
||||
struct ref;
|
||||
struct transport;
|
||||
struct strvec;
|
||||
|
|
@ -58,7 +60,8 @@ struct transport_vtable {
|
|||
* process involved generating new commits.
|
||||
**/
|
||||
int (*push_refs)(struct transport *transport, struct ref *refs, int flags);
|
||||
int (*connect)(struct transport *connection, const char *name,
|
||||
int (*connect)(struct transport *connection,
|
||||
enum git_connect_service service,
|
||||
const char *executable, int fd[2]);
|
||||
|
||||
/** get_refs_list(), fetch(), and push_refs() can keep
|
||||
|
|
|
|||
14
transport.c
14
transport.c
|
|
@ -309,8 +309,8 @@ static int connect_setup(struct transport *transport, int for_push)
|
|||
|
||||
data->conn = git_connect(data->fd, transport->url,
|
||||
for_push ?
|
||||
"git-receive-pack" :
|
||||
"git-upload-pack",
|
||||
GIT_CONNECT_RECEIVE_PACK :
|
||||
GIT_CONNECT_UPLOAD_PACK,
|
||||
for_push ?
|
||||
data->options.receivepack :
|
||||
data->options.uploadpack,
|
||||
|
|
@ -961,12 +961,13 @@ static int git_transport_push(struct transport *transport, struct ref *remote_re
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int connect_git(struct transport *transport, const char *name,
|
||||
static int connect_git(struct transport *transport,
|
||||
enum git_connect_service service,
|
||||
const char *executable, int fd[2])
|
||||
{
|
||||
struct git_transport_data *data = transport->data;
|
||||
data->conn = git_connect(data->fd, transport->url,
|
||||
name, executable, 0);
|
||||
service, executable, 0);
|
||||
fd[0] = data->fd[0];
|
||||
fd[1] = data->fd[1];
|
||||
return 0;
|
||||
|
|
@ -1664,11 +1665,12 @@ void transport_unlock_pack(struct transport *transport, unsigned int flags)
|
|||
string_list_clear(&transport->pack_lockfiles, 0);
|
||||
}
|
||||
|
||||
int transport_connect(struct transport *transport, const char *name,
|
||||
int transport_connect(struct transport *transport,
|
||||
enum git_connect_service service,
|
||||
const char *exec, int fd[2])
|
||||
{
|
||||
if (transport->vtable->connect)
|
||||
return transport->vtable->connect(transport, name, exec, fd);
|
||||
return transport->vtable->connect(transport, service, exec, fd);
|
||||
else
|
||||
die(_("operation not supported by protocol"));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
#include "remote.h"
|
||||
#include "list-objects-filter-options.h"
|
||||
#include "string-list.h"
|
||||
#include "connect.h"
|
||||
|
||||
struct git_transport_options {
|
||||
unsigned thin : 1;
|
||||
|
|
@ -325,7 +326,8 @@ char *transport_anonymize_url(const char *url);
|
|||
void transport_take_over(struct transport *transport,
|
||||
struct child_process *child);
|
||||
|
||||
int transport_connect(struct transport *transport, const char *name,
|
||||
int transport_connect(struct transport *transport,
|
||||
enum git_connect_service service,
|
||||
const char *exec, int fd[2]);
|
||||
|
||||
/* Transport methods defined outside transport.c */
|
||||
|
|
|
|||
Loading…
Reference in New Issue