transport.h 3.65 KB
Newer Older
Vicent Marti committed
1
/*
schu committed
2
 * Copyright (C) 2009-2012 the libgit2 contributors
Vicent Marti committed
3 4 5 6
 *
 * This file is part of libgit2, distributed under the GNU GPL v2 with
 * a Linking Exception. For full terms see the included COPYING file.
 */
7 8 9 10
#ifndef INCLUDE_transport_h__
#define INCLUDE_transport_h__

#include "git2/net.h"
11
#include "git2/indexer.h"
12
#include "vector.h"
13 14
#include "posix.h"
#include "common.h"
15 16 17 18 19
#ifdef GIT_SSL
# include <openssl/ssl.h>
# include <openssl/err.h>
#endif

20

21 22 23 24
#define GIT_CAP_OFS_DELTA "ofs-delta"

typedef struct git_transport_caps {
	int common:1,
Vicent Marti committed
25
		ofs_delta:1;
26 27
} git_transport_caps;

28 29 30 31 32 33 34 35
#ifdef GIT_SSL
typedef struct gitno_ssl {
	SSL_CTX *ctx;
	SSL *ssl;
} gitno_ssl;
#endif


36 37 38 39 40 41 42 43 44 45 46 47 48 49
/*
 * A day in the life of a network operation
 * ========================================
 *
 * The library gets told to ls-remote/push/fetch on/to/from some
 * remote. We look at the URL of the remote and fill the function
 * table with whatever is appropriate (the remote may be git over git,
 * ssh or http(s). It may even be an hg or svn repository, the library
 * at this level doesn't care, it just calls the helpers.
 *
 * The first call is to ->connect() which connects to the remote,
 * making use of the direction if necessary. This function must also
 * store the remote heads and any other information it needs.
 *
50 51 52 53 54 55 56 57 58 59
 * The next useful step is to call ->ls() to get the list of
 * references available to the remote. These references may have been
 * collected on connect, or we may build them now. For ls-remote,
 * nothing else is needed other than closing the connection.
 * Otherwise, the higher leves decide which objects we want to
 * have. ->send_have() is used to tell the other end what we have. If
 * we do need to download a pack, ->download_pack() is called.
 *
 * When we're done, we call ->close() to close the
 * connection. ->free() takes care of freeing all the resources.
60 61 62 63 64 65 66 67 68 69
 */

struct git_transport {
	/**
	 * Where the repo lives
	 */
	char *url;
	/**
	 * Whether we want to push or fetch
	 */
Vicent Marti committed
70
	int direction : 1, /* 0 fetch, 1 push */
71
		connected : 1,
72
		check_cert: 1,
73
		encrypt : 1;
74
#ifdef GIT_SSL
75 76 77
	struct gitno_ssl ssl;
#endif
	GIT_SOCKET socket;
78 79 80
	/**
	 * Connect and store the remote heads
	 */
81
	int (*connect)(struct git_transport *transport, int dir);
82 83 84
	/**
	 * Give a list of references, useful for ls-remote
	 */
85
	int (*ls)(struct git_transport *transport, git_headlist_cb list_cb, void *opaque);
86 87 88 89 90
	/**
	 * Push the changes over
	 */
	int (*push)(struct git_transport *transport);
	/**
91 92 93
	 * Negotiate the minimal amount of objects that need to be
	 * retrieved
	 */
94
	int (*negotiate_fetch)(struct git_transport *transport, git_repository *repo, const git_vector *wants);
95
	/**
Carlos Martín Nieto committed
96 97
	 * Download the packfile
	 */
98
	int (*download_pack)(struct git_transport *transport, git_repository *repo, git_off_t *bytes, git_indexer_stats *stats);
Carlos Martín Nieto committed
99
	/**
100 101 102 103 104 105 106
	 * Fetch the changes
	 */
	int (*fetch)(struct git_transport *transport);
	/**
	 * Close the connection
	 */
	int (*close)(struct git_transport *transport);
107 108 109 110
	/**
	 * Free the associated resources
	 */
	void (*free)(struct git_transport *transport);
111 112
};

113 114

int git_transport_new(struct git_transport **transport, const char *url);
115 116
int git_transport_local(struct git_transport **transport);
int git_transport_git(struct git_transport **transport);
117
int git_transport_http(struct git_transport **transport);
118
int git_transport_https(struct git_transport **transport);
119
int git_transport_dummy(struct git_transport **transport);
120 121 122 123 124

/**
  Returns true if the passed URL is valid (a URL with a Git supported scheme,
  or pointing to an existing path)
*/
125 126 127 128
int git_transport_valid_url(const char *url);

typedef struct git_transport git_transport;
typedef int (*git_transport_cb)(git_transport **transport);
129 130

#endif