Blame src/transports/smart.h

Packit ae9e2a
/*
Packit ae9e2a
 * Copyright (C) the libgit2 contributors. All rights reserved.
Packit ae9e2a
 *
Packit ae9e2a
 * This file is part of libgit2, distributed under the GNU GPL v2 with
Packit ae9e2a
 * a Linking Exception. For full terms see the included COPYING file.
Packit ae9e2a
 */
Packit ae9e2a
#include "git2.h"
Packit ae9e2a
#include "vector.h"
Packit ae9e2a
#include "netops.h"
Packit ae9e2a
#include "buffer.h"
Packit ae9e2a
#include "push.h"
Packit ae9e2a
#include "git2/sys/transport.h"
Packit ae9e2a
Packit ae9e2a
#define GIT_SIDE_BAND_DATA     1
Packit ae9e2a
#define GIT_SIDE_BAND_PROGRESS 2
Packit ae9e2a
#define GIT_SIDE_BAND_ERROR    3
Packit ae9e2a
Packit ae9e2a
#define GIT_CAP_OFS_DELTA "ofs-delta"
Packit ae9e2a
#define GIT_CAP_MULTI_ACK "multi_ack"
Packit ae9e2a
#define GIT_CAP_MULTI_ACK_DETAILED "multi_ack_detailed"
Packit ae9e2a
#define GIT_CAP_SIDE_BAND "side-band"
Packit ae9e2a
#define GIT_CAP_SIDE_BAND_64K "side-band-64k"
Packit ae9e2a
#define GIT_CAP_INCLUDE_TAG "include-tag"
Packit ae9e2a
#define GIT_CAP_DELETE_REFS "delete-refs"
Packit ae9e2a
#define GIT_CAP_REPORT_STATUS "report-status"
Packit ae9e2a
#define GIT_CAP_THIN_PACK "thin-pack"
Packit ae9e2a
#define GIT_CAP_SYMREF "symref"
Packit ae9e2a
Packit ae9e2a
extern bool git_smart__ofs_delta_enabled;
Packit ae9e2a
Packit ae9e2a
typedef enum {
Packit ae9e2a
	GIT_PKT_CMD,
Packit ae9e2a
	GIT_PKT_FLUSH,
Packit ae9e2a
	GIT_PKT_REF,
Packit ae9e2a
	GIT_PKT_HAVE,
Packit ae9e2a
	GIT_PKT_ACK,
Packit ae9e2a
	GIT_PKT_NAK,
Packit ae9e2a
	GIT_PKT_PACK__UNUSED,
Packit ae9e2a
	GIT_PKT_COMMENT,
Packit ae9e2a
	GIT_PKT_ERR,
Packit ae9e2a
	GIT_PKT_DATA,
Packit ae9e2a
	GIT_PKT_PROGRESS,
Packit ae9e2a
	GIT_PKT_OK,
Packit ae9e2a
	GIT_PKT_NG,
Packit ae9e2a
	GIT_PKT_UNPACK,
Packit ae9e2a
} git_pkt_type;
Packit ae9e2a
Packit ae9e2a
/* Used for multi_ack and mutli_ack_detailed */
Packit ae9e2a
enum git_ack_status {
Packit ae9e2a
	GIT_ACK_NONE,
Packit ae9e2a
	GIT_ACK_CONTINUE,
Packit ae9e2a
	GIT_ACK_COMMON,
Packit ae9e2a
	GIT_ACK_READY
Packit ae9e2a
};
Packit ae9e2a
Packit ae9e2a
/* This would be a flush pkt */
Packit ae9e2a
typedef struct {
Packit ae9e2a
	git_pkt_type type;
Packit ae9e2a
} git_pkt;
Packit ae9e2a
Packit ae9e2a
struct git_pkt_cmd {
Packit ae9e2a
	git_pkt_type type;
Packit ae9e2a
	char *cmd;
Packit ae9e2a
	char *path;
Packit ae9e2a
	char *host;
Packit ae9e2a
};
Packit ae9e2a
Packit ae9e2a
/* This is a pkt-line with some info in it */
Packit ae9e2a
typedef struct {
Packit ae9e2a
	git_pkt_type type;
Packit ae9e2a
	git_remote_head head;
Packit ae9e2a
	char *capabilities;
Packit ae9e2a
} git_pkt_ref;
Packit ae9e2a
Packit ae9e2a
/* Useful later */
Packit ae9e2a
typedef struct {
Packit ae9e2a
	git_pkt_type type;
Packit ae9e2a
	git_oid oid;
Packit ae9e2a
	enum git_ack_status status;
Packit ae9e2a
} git_pkt_ack;
Packit ae9e2a
Packit ae9e2a
typedef struct {
Packit ae9e2a
	git_pkt_type type;
Packit ae9e2a
	char comment[GIT_FLEX_ARRAY];
Packit ae9e2a
} git_pkt_comment;
Packit ae9e2a
Packit ae9e2a
typedef struct {
Packit ae9e2a
	git_pkt_type type;
Packit ae9e2a
	size_t len;
Packit ae9e2a
	char data[GIT_FLEX_ARRAY];
Packit ae9e2a
} git_pkt_data;
Packit ae9e2a
Packit ae9e2a
typedef git_pkt_data git_pkt_progress;
Packit ae9e2a
Packit ae9e2a
typedef struct {
Packit ae9e2a
	git_pkt_type type;
Packit ae9e2a
	size_t len;
Packit ae9e2a
	char error[GIT_FLEX_ARRAY];
Packit ae9e2a
} git_pkt_err;
Packit ae9e2a
Packit ae9e2a
typedef struct {
Packit ae9e2a
	git_pkt_type type;
Packit ae9e2a
	char *ref;
Packit ae9e2a
} git_pkt_ok;
Packit ae9e2a
Packit ae9e2a
typedef struct {
Packit ae9e2a
	git_pkt_type type;
Packit ae9e2a
	char *ref;
Packit ae9e2a
	char *msg;
Packit ae9e2a
} git_pkt_ng;
Packit ae9e2a
Packit ae9e2a
typedef struct {
Packit ae9e2a
	git_pkt_type type;
Packit ae9e2a
	int unpack_ok;
Packit ae9e2a
} git_pkt_unpack;
Packit ae9e2a
Packit ae9e2a
typedef struct transport_smart_caps {
Packit ae9e2a
	int common:1,
Packit ae9e2a
		ofs_delta:1,
Packit ae9e2a
		multi_ack: 1,
Packit ae9e2a
		multi_ack_detailed: 1,
Packit ae9e2a
		side_band:1,
Packit ae9e2a
		side_band_64k:1,
Packit ae9e2a
		include_tag:1,
Packit ae9e2a
		delete_refs:1,
Packit ae9e2a
		report_status:1,
Packit ae9e2a
		thin_pack:1;
Packit ae9e2a
} transport_smart_caps;
Packit ae9e2a
Packit ae9e2a
typedef int (*packetsize_cb)(size_t received, void *payload);
Packit ae9e2a
Packit ae9e2a
typedef struct {
Packit ae9e2a
	git_transport parent;
Packit ae9e2a
	git_remote *owner;
Packit ae9e2a
	char *url;
Packit ae9e2a
	git_cred_acquire_cb cred_acquire_cb;
Packit ae9e2a
	void *cred_acquire_payload;
Packit ae9e2a
	git_proxy_options proxy;
Packit ae9e2a
	int direction;
Packit ae9e2a
	int flags;
Packit ae9e2a
	git_transport_message_cb progress_cb;
Packit ae9e2a
	git_transport_message_cb error_cb;
Packit ae9e2a
	git_transport_certificate_check_cb certificate_check_cb;
Packit ae9e2a
	void *message_cb_payload;
Packit ae9e2a
	git_strarray custom_headers;
Packit ae9e2a
	git_smart_subtransport *wrapped;
Packit ae9e2a
	git_smart_subtransport_stream *current_stream;
Packit ae9e2a
	transport_smart_caps caps;
Packit ae9e2a
	git_vector refs;
Packit ae9e2a
	git_vector heads;
Packit ae9e2a
	git_vector common;
Packit ae9e2a
	git_atomic cancelled;
Packit ae9e2a
	packetsize_cb packetsize_cb;
Packit ae9e2a
	void *packetsize_payload;
Packit ae9e2a
	unsigned rpc : 1,
Packit ae9e2a
		have_refs : 1,
Packit ae9e2a
		connected : 1;
Packit ae9e2a
	gitno_buffer buffer;
Packit ae9e2a
	char buffer_data[65536];
Packit ae9e2a
} transport_smart;
Packit ae9e2a
Packit ae9e2a
/* smart_protocol.c */
Packit ae9e2a
int git_smart__store_refs(transport_smart *t, int flushes);
Packit ae9e2a
int git_smart__detect_caps(git_pkt_ref *pkt, transport_smart_caps *caps, git_vector *symrefs);
Packit ae9e2a
int git_smart__push(git_transport *transport, git_push *push, const git_remote_callbacks *cbs);
Packit ae9e2a
Packit ae9e2a
int git_smart__negotiate_fetch(
Packit ae9e2a
	git_transport *transport,
Packit ae9e2a
	git_repository *repo,
Packit ae9e2a
	const git_remote_head * const *refs,
Packit ae9e2a
	size_t count);
Packit ae9e2a
Packit ae9e2a
int git_smart__download_pack(
Packit ae9e2a
	git_transport *transport,
Packit ae9e2a
	git_repository *repo,
Packit ae9e2a
	git_transfer_progress *stats,
Packit ae9e2a
	git_transfer_progress_cb progress_cb,
Packit ae9e2a
	void *progress_payload);
Packit ae9e2a
Packit ae9e2a
/* smart.c */
Packit ae9e2a
int git_smart__negotiation_step(git_transport *transport, void *data, size_t len);
Packit ae9e2a
int git_smart__get_push_stream(transport_smart *t, git_smart_subtransport_stream **out);
Packit ae9e2a
Packit ae9e2a
int git_smart__update_heads(transport_smart *t, git_vector *symrefs);
Packit ae9e2a
Packit ae9e2a
/* smart_pkt.c */
Packit ae9e2a
int git_pkt_parse_line(git_pkt **head, const char **endptr, const char *line, size_t linelen);
Packit ae9e2a
int git_pkt_buffer_flush(git_buf *buf);
Packit ae9e2a
int git_pkt_send_flush(GIT_SOCKET s);
Packit ae9e2a
int git_pkt_buffer_done(git_buf *buf);
Packit ae9e2a
int git_pkt_buffer_wants(const git_remote_head * const *refs, size_t count, transport_smart_caps *caps, git_buf *buf);
Packit ae9e2a
int git_pkt_buffer_have(git_oid *oid, git_buf *buf);
Packit ae9e2a
void git_pkt_free(git_pkt *pkt);