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" argument
main
Junio C Hamano 2026-06-02 16:15:28 +09:00
commit 7b3ab91768
9 changed files with 58 additions and 28 deletions

View File

@ -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

View File

@ -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;

View File

@ -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,

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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

View File

@ -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"));
}

View File

@ -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 */