mirror of
https://git.proxmox.com/git/libgit2
synced 2025-07-20 22:46:43 +00:00
Merge pull request #3411 from spraints/custom-push-headers
Include custom HTTP headers
This commit is contained in:
commit
72b7c57093
@ -26,7 +26,7 @@ static int use_remote(git_repository *repo, char *name)
|
|||||||
*/
|
*/
|
||||||
callbacks.credentials = cred_acquire_cb;
|
callbacks.credentials = cred_acquire_cb;
|
||||||
|
|
||||||
error = git_remote_connect(remote, GIT_DIRECTION_FETCH, &callbacks);
|
error = git_remote_connect(remote, GIT_DIRECTION_FETCH, &callbacks, NULL);
|
||||||
if (error < 0)
|
if (error < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
@ -241,9 +241,10 @@ GIT_EXTERN(const git_refspec *)git_remote_get_refspec(const git_remote *remote,
|
|||||||
* @param direction GIT_DIRECTION_FETCH if you want to fetch or
|
* @param direction GIT_DIRECTION_FETCH if you want to fetch or
|
||||||
* GIT_DIRECTION_PUSH if you want to push
|
* GIT_DIRECTION_PUSH if you want to push
|
||||||
* @param callbacks the callbacks to use for this connection
|
* @param callbacks the callbacks to use for this connection
|
||||||
|
* @param custom_headers extra HTTP headers to use in this connection
|
||||||
* @return 0 or an error code
|
* @return 0 or an error code
|
||||||
*/
|
*/
|
||||||
GIT_EXTERN(int) git_remote_connect(git_remote *remote, git_direction direction, const git_remote_callbacks *callbacks);
|
GIT_EXTERN(int) git_remote_connect(git_remote *remote, git_direction direction, const git_remote_callbacks *callbacks, const git_strarray *custom_headers);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the remote repository's reference advertisement list
|
* Get the remote repository's reference advertisement list
|
||||||
@ -546,6 +547,11 @@ typedef struct {
|
|||||||
* The default is to auto-follow tags.
|
* The default is to auto-follow tags.
|
||||||
*/
|
*/
|
||||||
git_remote_autotag_option_t download_tags;
|
git_remote_autotag_option_t download_tags;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extra headers for this fetch operation
|
||||||
|
*/
|
||||||
|
git_strarray custom_headers;
|
||||||
} git_fetch_options;
|
} git_fetch_options;
|
||||||
|
|
||||||
#define GIT_FETCH_OPTIONS_VERSION 1
|
#define GIT_FETCH_OPTIONS_VERSION 1
|
||||||
@ -585,6 +591,11 @@ typedef struct {
|
|||||||
* Callbacks to use for this push operation
|
* Callbacks to use for this push operation
|
||||||
*/
|
*/
|
||||||
git_remote_callbacks callbacks;
|
git_remote_callbacks callbacks;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extra headers for this push operation
|
||||||
|
*/
|
||||||
|
git_strarray custom_headers;
|
||||||
} git_push_options;
|
} git_push_options;
|
||||||
|
|
||||||
#define GIT_PUSH_OPTIONS_VERSION 1
|
#define GIT_PUSH_OPTIONS_VERSION 1
|
||||||
|
@ -40,6 +40,11 @@ struct git_transport {
|
|||||||
git_transport_certificate_check_cb certificate_check_cb,
|
git_transport_certificate_check_cb certificate_check_cb,
|
||||||
void *payload);
|
void *payload);
|
||||||
|
|
||||||
|
/* Set custom headers for HTTP requests */
|
||||||
|
int (*set_custom_headers)(
|
||||||
|
git_transport *transport,
|
||||||
|
const git_strarray *custom_headers);
|
||||||
|
|
||||||
/* Connect the transport to the remote repository, using the given
|
/* Connect the transport to the remote repository, using the given
|
||||||
* direction. */
|
* direction. */
|
||||||
int (*connect)(
|
int (*connect)(
|
||||||
|
@ -73,6 +73,7 @@ int git_push_set_options(git_push *push, const git_push_options *opts)
|
|||||||
GITERR_CHECK_VERSION(opts, GIT_PUSH_OPTIONS_VERSION, "git_push_options");
|
GITERR_CHECK_VERSION(opts, GIT_PUSH_OPTIONS_VERSION, "git_push_options");
|
||||||
|
|
||||||
push->pb_parallelism = opts->pb_parallelism;
|
push->pb_parallelism = opts->pb_parallelism;
|
||||||
|
push->custom_headers = &opts->custom_headers;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -638,7 +639,7 @@ int git_push_finish(git_push *push, const git_remote_callbacks *callbacks)
|
|||||||
int error;
|
int error;
|
||||||
|
|
||||||
if (!git_remote_connected(push->remote) &&
|
if (!git_remote_connected(push->remote) &&
|
||||||
(error = git_remote_connect(push->remote, GIT_DIRECTION_PUSH, callbacks)) < 0)
|
(error = git_remote_connect(push->remote, GIT_DIRECTION_PUSH, callbacks, push->custom_headers)) < 0)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
if ((error = filter_refs(push->remote)) < 0 ||
|
if ((error = filter_refs(push->remote)) < 0 ||
|
||||||
|
@ -38,6 +38,7 @@ struct git_push {
|
|||||||
|
|
||||||
/* options */
|
/* options */
|
||||||
unsigned pb_parallelism;
|
unsigned pb_parallelism;
|
||||||
|
const git_strarray *custom_headers;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
32
src/remote.c
32
src/remote.c
@ -687,7 +687,15 @@ int set_transport_callbacks(git_transport *t, const git_remote_callbacks *cbs)
|
|||||||
cbs->certificate_check, cbs->payload);
|
cbs->certificate_check, cbs->payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
int git_remote_connect(git_remote *remote, git_direction direction, const git_remote_callbacks *callbacks)
|
static int set_transport_custom_headers(git_transport *t, const git_strarray *custom_headers)
|
||||||
|
{
|
||||||
|
if (!t->set_custom_headers)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return t->set_custom_headers(t, custom_headers);
|
||||||
|
}
|
||||||
|
|
||||||
|
int git_remote_connect(git_remote *remote, git_direction direction, const git_remote_callbacks *callbacks, const git_strarray *custom_headers)
|
||||||
{
|
{
|
||||||
git_transport *t;
|
git_transport *t;
|
||||||
const char *url;
|
const char *url;
|
||||||
@ -726,6 +734,9 @@ int git_remote_connect(git_remote *remote, git_direction direction, const git_re
|
|||||||
if (!t && (error = git_transport_new(&t, remote, url)) < 0)
|
if (!t && (error = git_transport_new(&t, remote, url)) < 0)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
|
if ((error = set_transport_custom_headers(t, custom_headers)) != 0)
|
||||||
|
goto on_error;
|
||||||
|
|
||||||
if ((error = set_transport_callbacks(t, callbacks)) < 0 ||
|
if ((error = set_transport_callbacks(t, callbacks)) < 0 ||
|
||||||
(error = t->connect(t, url, credentials, payload, direction, flags)) != 0)
|
(error = t->connect(t, url, credentials, payload, direction, flags)) != 0)
|
||||||
goto on_error;
|
goto on_error;
|
||||||
@ -884,16 +895,18 @@ int git_remote_download(git_remote *remote, const git_strarray *refspecs, const
|
|||||||
size_t i;
|
size_t i;
|
||||||
git_vector *to_active, specs = GIT_VECTOR_INIT, refs = GIT_VECTOR_INIT;
|
git_vector *to_active, specs = GIT_VECTOR_INIT, refs = GIT_VECTOR_INIT;
|
||||||
const git_remote_callbacks *cbs = NULL;
|
const git_remote_callbacks *cbs = NULL;
|
||||||
|
const git_strarray *custom_headers = NULL;
|
||||||
|
|
||||||
assert(remote);
|
assert(remote);
|
||||||
|
|
||||||
if (opts) {
|
if (opts) {
|
||||||
GITERR_CHECK_VERSION(&opts->callbacks, GIT_REMOTE_CALLBACKS_VERSION, "git_remote_callbacks");
|
GITERR_CHECK_VERSION(&opts->callbacks, GIT_REMOTE_CALLBACKS_VERSION, "git_remote_callbacks");
|
||||||
cbs = &opts->callbacks;
|
cbs = &opts->callbacks;
|
||||||
|
custom_headers = &opts->custom_headers;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!git_remote_connected(remote) &&
|
if (!git_remote_connected(remote) &&
|
||||||
(error = git_remote_connect(remote, GIT_DIRECTION_FETCH, cbs)) < 0)
|
(error = git_remote_connect(remote, GIT_DIRECTION_FETCH, cbs, custom_headers)) < 0)
|
||||||
goto on_error;
|
goto on_error;
|
||||||
|
|
||||||
if (ls_to_vector(&refs, remote) < 0)
|
if (ls_to_vector(&refs, remote) < 0)
|
||||||
@ -957,16 +970,18 @@ int git_remote_fetch(
|
|||||||
bool prune = false;
|
bool prune = false;
|
||||||
git_buf reflog_msg_buf = GIT_BUF_INIT;
|
git_buf reflog_msg_buf = GIT_BUF_INIT;
|
||||||
const git_remote_callbacks *cbs = NULL;
|
const git_remote_callbacks *cbs = NULL;
|
||||||
|
const git_strarray *custom_headers = NULL;
|
||||||
|
|
||||||
if (opts) {
|
if (opts) {
|
||||||
GITERR_CHECK_VERSION(&opts->callbacks, GIT_REMOTE_CALLBACKS_VERSION, "git_remote_callbacks");
|
GITERR_CHECK_VERSION(&opts->callbacks, GIT_REMOTE_CALLBACKS_VERSION, "git_remote_callbacks");
|
||||||
cbs = &opts->callbacks;
|
cbs = &opts->callbacks;
|
||||||
|
custom_headers = &opts->custom_headers;
|
||||||
update_fetchhead = opts->update_fetchhead;
|
update_fetchhead = opts->update_fetchhead;
|
||||||
tagopt = opts->download_tags;
|
tagopt = opts->download_tags;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Connect and download everything */
|
/* Connect and download everything */
|
||||||
if ((error = git_remote_connect(remote, GIT_DIRECTION_FETCH, cbs)) != 0)
|
if ((error = git_remote_connect(remote, GIT_DIRECTION_FETCH, cbs, custom_headers)) != 0)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
error = git_remote_download(remote, refspecs, opts);
|
error = git_remote_download(remote, refspecs, opts);
|
||||||
@ -2377,14 +2392,17 @@ int git_remote_upload(git_remote *remote, const git_strarray *refspecs, const gi
|
|||||||
git_push *push;
|
git_push *push;
|
||||||
git_refspec *spec;
|
git_refspec *spec;
|
||||||
const git_remote_callbacks *cbs = NULL;
|
const git_remote_callbacks *cbs = NULL;
|
||||||
|
const git_strarray *custom_headers = NULL;
|
||||||
|
|
||||||
assert(remote);
|
assert(remote);
|
||||||
|
|
||||||
if (opts)
|
if (opts) {
|
||||||
cbs = &opts->callbacks;
|
cbs = &opts->callbacks;
|
||||||
|
custom_headers = &opts->custom_headers;
|
||||||
|
}
|
||||||
|
|
||||||
if (!git_remote_connected(remote) &&
|
if (!git_remote_connected(remote) &&
|
||||||
(error = git_remote_connect(remote, GIT_DIRECTION_PUSH, cbs)) < 0)
|
(error = git_remote_connect(remote, GIT_DIRECTION_PUSH, cbs, custom_headers)) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
free_refspecs(&remote->active_refspecs);
|
free_refspecs(&remote->active_refspecs);
|
||||||
@ -2433,15 +2451,17 @@ int git_remote_push(git_remote *remote, const git_strarray *refspecs, const git_
|
|||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
const git_remote_callbacks *cbs = NULL;
|
const git_remote_callbacks *cbs = NULL;
|
||||||
|
const git_strarray *custom_headers = NULL;
|
||||||
|
|
||||||
if (opts) {
|
if (opts) {
|
||||||
GITERR_CHECK_VERSION(&opts->callbacks, GIT_REMOTE_CALLBACKS_VERSION, "git_remote_callbacks");
|
GITERR_CHECK_VERSION(&opts->callbacks, GIT_REMOTE_CALLBACKS_VERSION, "git_remote_callbacks");
|
||||||
cbs = &opts->callbacks;
|
cbs = &opts->callbacks;
|
||||||
|
custom_headers = &opts->custom_headers;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(remote && refspecs);
|
assert(remote && refspecs);
|
||||||
|
|
||||||
if ((error = git_remote_connect(remote, GIT_DIRECTION_PUSH, cbs)) < 0)
|
if ((error = git_remote_connect(remote, GIT_DIRECTION_PUSH, cbs, custom_headers)) < 0)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
if ((error = git_remote_upload(remote, refspecs, opts)) < 0)
|
if ((error = git_remote_upload(remote, refspecs, opts)) < 0)
|
||||||
|
@ -193,6 +193,7 @@ static int gen_request(
|
|||||||
{
|
{
|
||||||
http_subtransport *t = OWNING_SUBTRANSPORT(s);
|
http_subtransport *t = OWNING_SUBTRANSPORT(s);
|
||||||
const char *path = t->connection_data.path ? t->connection_data.path : "/";
|
const char *path = t->connection_data.path ? t->connection_data.path : "/";
|
||||||
|
size_t i;
|
||||||
|
|
||||||
git_buf_printf(buf, "%s %s%s HTTP/1.1\r\n", s->verb, path, s->service_url);
|
git_buf_printf(buf, "%s %s%s HTTP/1.1\r\n", s->verb, path, s->service_url);
|
||||||
|
|
||||||
@ -210,6 +211,11 @@ static int gen_request(
|
|||||||
} else
|
} else
|
||||||
git_buf_puts(buf, "Accept: */*\r\n");
|
git_buf_puts(buf, "Accept: */*\r\n");
|
||||||
|
|
||||||
|
for (i = 0; i < t->owner->custom_headers.count; i++) {
|
||||||
|
if (t->owner->custom_headers.strings[i])
|
||||||
|
git_buf_printf(buf, "%s\r\n", t->owner->custom_headers.strings[i]);
|
||||||
|
}
|
||||||
|
|
||||||
/* Apply credentials to the request */
|
/* Apply credentials to the request */
|
||||||
if (apply_credentials(buf, t) < 0)
|
if (apply_credentials(buf, t) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -66,6 +66,84 @@ static int git_smart__set_callbacks(
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int http_header_name_length(const char *http_header)
|
||||||
|
{
|
||||||
|
const char *colon = strchr(http_header, ':');
|
||||||
|
if (!colon)
|
||||||
|
return 0;
|
||||||
|
return colon - http_header;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool is_malformed_http_header(const char *http_header)
|
||||||
|
{
|
||||||
|
const char *c;
|
||||||
|
int name_len;
|
||||||
|
|
||||||
|
// Disallow \r and \n
|
||||||
|
c = strchr(http_header, '\r');
|
||||||
|
if (c)
|
||||||
|
return true;
|
||||||
|
c = strchr(http_header, '\n');
|
||||||
|
if (c)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// Require a header name followed by :
|
||||||
|
name_len = http_header_name_length(http_header);
|
||||||
|
if (name_len < 1)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *forbidden_custom_headers[] = {
|
||||||
|
"User-Agent",
|
||||||
|
"Host",
|
||||||
|
"Accept",
|
||||||
|
"Content-Type",
|
||||||
|
"Transfer-Encoding",
|
||||||
|
"Content-Length",
|
||||||
|
};
|
||||||
|
|
||||||
|
static bool is_forbidden_custom_header(const char *custom_header)
|
||||||
|
{
|
||||||
|
unsigned long i;
|
||||||
|
int name_len = http_header_name_length(custom_header);
|
||||||
|
|
||||||
|
// Disallow headers that we set
|
||||||
|
for (i = 0; i < ARRAY_SIZE(forbidden_custom_headers); i++)
|
||||||
|
if (strncmp(forbidden_custom_headers[i], custom_header, name_len) == 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int git_smart__set_custom_headers(
|
||||||
|
git_transport *transport,
|
||||||
|
const git_strarray *custom_headers)
|
||||||
|
{
|
||||||
|
transport_smart *t = (transport_smart *)transport;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
if (t->custom_headers.count)
|
||||||
|
git_strarray_free(&t->custom_headers);
|
||||||
|
|
||||||
|
if (!custom_headers)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for (i = 0; i < custom_headers->count; i++) {
|
||||||
|
if (is_malformed_http_header(custom_headers->strings[i])) {
|
||||||
|
giterr_set(GITERR_INVALID, "custom HTTP header '%s' is malformed", custom_headers->strings[i]);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (is_forbidden_custom_header(custom_headers->strings[i])) {
|
||||||
|
giterr_set(GITERR_INVALID, "custom HTTP header '%s' is already set by libgit2", custom_headers->strings[i]);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return git_strarray_copy(&t->custom_headers, custom_headers);
|
||||||
|
}
|
||||||
|
|
||||||
int git_smart__update_heads(transport_smart *t, git_vector *symrefs)
|
int git_smart__update_heads(transport_smart *t, git_vector *symrefs)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
@ -362,6 +440,8 @@ static void git_smart__free(git_transport *transport)
|
|||||||
|
|
||||||
git_vector_free(refs);
|
git_vector_free(refs);
|
||||||
|
|
||||||
|
git_strarray_free(&t->custom_headers);
|
||||||
|
|
||||||
git__free(t);
|
git__free(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -399,6 +479,7 @@ int git_transport_smart(git_transport **out, git_remote *owner, void *param)
|
|||||||
|
|
||||||
t->parent.version = GIT_TRANSPORT_VERSION;
|
t->parent.version = GIT_TRANSPORT_VERSION;
|
||||||
t->parent.set_callbacks = git_smart__set_callbacks;
|
t->parent.set_callbacks = git_smart__set_callbacks;
|
||||||
|
t->parent.set_custom_headers = git_smart__set_custom_headers;
|
||||||
t->parent.connect = git_smart__connect;
|
t->parent.connect = git_smart__connect;
|
||||||
t->parent.close = git_smart__close;
|
t->parent.close = git_smart__close;
|
||||||
t->parent.free = git_smart__free;
|
t->parent.free = git_smart__free;
|
||||||
|
@ -139,6 +139,7 @@ typedef struct {
|
|||||||
git_transport_message_cb error_cb;
|
git_transport_message_cb error_cb;
|
||||||
git_transport_certificate_check_cb certificate_check_cb;
|
git_transport_certificate_check_cb certificate_check_cb;
|
||||||
void *message_cb_payload;
|
void *message_cb_payload;
|
||||||
|
git_strarray custom_headers;
|
||||||
git_smart_subtransport *wrapped;
|
git_smart_subtransport *wrapped;
|
||||||
git_smart_subtransport_stream *current_stream;
|
git_smart_subtransport_stream *current_stream;
|
||||||
transport_smart_caps caps;
|
transport_smart_caps caps;
|
||||||
|
@ -277,6 +277,7 @@ static int winhttp_stream_connect(winhttp_stream *s)
|
|||||||
unsigned long disable_redirects = WINHTTP_DISABLE_REDIRECTS;
|
unsigned long disable_redirects = WINHTTP_DISABLE_REDIRECTS;
|
||||||
int default_timeout = TIMEOUT_INFINITE;
|
int default_timeout = TIMEOUT_INFINITE;
|
||||||
int default_connect_timeout = DEFAULT_CONNECT_TIMEOUT;
|
int default_connect_timeout = DEFAULT_CONNECT_TIMEOUT;
|
||||||
|
int i;
|
||||||
|
|
||||||
/* Prepare URL */
|
/* Prepare URL */
|
||||||
git_buf_printf(&buf, "%s%s", t->connection_data.path, s->service_url);
|
git_buf_printf(&buf, "%s%s", t->connection_data.path, s->service_url);
|
||||||
@ -409,6 +410,23 @@ static int winhttp_stream_connect(winhttp_stream *s)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < t->owner->custom_headers.count; i++) {
|
||||||
|
if (t->owner->custom_headers.strings[i]) {
|
||||||
|
git_buf_clear(&buf);
|
||||||
|
git_buf_puts(&buf, t->owner->custom_headers.strings[i]);
|
||||||
|
if (git__utf8_to_16(ct, MAX_CONTENT_TYPE_LEN, git_buf_cstr(&buf)) < 0) {
|
||||||
|
giterr_set(GITERR_OS, "Failed to convert custom header to wide characters");
|
||||||
|
goto on_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!WinHttpAddRequestHeaders(s->request, ct, (ULONG)-1L,
|
||||||
|
WINHTTP_ADDREQ_FLAG_ADD | WINHTTP_ADDREQ_FLAG_REPLACE)) {
|
||||||
|
giterr_set(GITERR_OS, "Failed to add a header to the request");
|
||||||
|
goto on_error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* If requested, disable certificate validation */
|
/* If requested, disable certificate validation */
|
||||||
if (t->connection_data.use_ssl) {
|
if (t->connection_data.use_ssl) {
|
||||||
int flags;
|
int flags;
|
||||||
|
@ -26,7 +26,7 @@ static void assert_default_branch(const char *should)
|
|||||||
{
|
{
|
||||||
git_buf name = GIT_BUF_INIT;
|
git_buf name = GIT_BUF_INIT;
|
||||||
|
|
||||||
cl_git_pass(git_remote_connect(g_remote, GIT_DIRECTION_FETCH, NULL));
|
cl_git_pass(git_remote_connect(g_remote, GIT_DIRECTION_FETCH, NULL, NULL));
|
||||||
cl_git_pass(git_remote_default_branch(&name, g_remote));
|
cl_git_pass(git_remote_default_branch(&name, g_remote));
|
||||||
cl_assert_equal_s(should, name.ptr);
|
cl_assert_equal_s(should, name.ptr);
|
||||||
git_buf_free(&name);
|
git_buf_free(&name);
|
||||||
@ -57,7 +57,7 @@ void test_network_remote_defaultbranch__no_default_branch(void)
|
|||||||
git_buf buf = GIT_BUF_INIT;
|
git_buf buf = GIT_BUF_INIT;
|
||||||
|
|
||||||
cl_git_pass(git_remote_create(&remote_b, g_repo_b, "self", git_repository_path(g_repo_b)));
|
cl_git_pass(git_remote_create(&remote_b, g_repo_b, "self", git_repository_path(g_repo_b)));
|
||||||
cl_git_pass(git_remote_connect(remote_b, GIT_DIRECTION_FETCH, NULL));
|
cl_git_pass(git_remote_connect(remote_b, GIT_DIRECTION_FETCH, NULL, NULL));
|
||||||
cl_git_pass(git_remote_ls(&heads, &len, remote_b));
|
cl_git_pass(git_remote_ls(&heads, &len, remote_b));
|
||||||
cl_assert_equal_i(0, len);
|
cl_assert_equal_i(0, len);
|
||||||
|
|
||||||
@ -80,7 +80,7 @@ void test_network_remote_defaultbranch__detached_sharing_nonbranch_id(void)
|
|||||||
cl_git_pass(git_reference_create(&ref, g_repo_a, "refs/foo/bar", &id, 1, NULL));
|
cl_git_pass(git_reference_create(&ref, g_repo_a, "refs/foo/bar", &id, 1, NULL));
|
||||||
git_reference_free(ref);
|
git_reference_free(ref);
|
||||||
|
|
||||||
cl_git_pass(git_remote_connect(g_remote, GIT_DIRECTION_FETCH, NULL));
|
cl_git_pass(git_remote_connect(g_remote, GIT_DIRECTION_FETCH, NULL, NULL));
|
||||||
cl_git_fail_with(GIT_ENOTFOUND, git_remote_default_branch(&buf, g_remote));
|
cl_git_fail_with(GIT_ENOTFOUND, git_remote_default_branch(&buf, g_remote));
|
||||||
|
|
||||||
cl_git_pass(git_clone(&cloned_repo, git_repository_path(g_repo_a), "./local-detached", NULL));
|
cl_git_pass(git_clone(&cloned_repo, git_repository_path(g_repo_a), "./local-detached", NULL));
|
||||||
|
@ -40,7 +40,7 @@ static void connect_to_local_repository(const char *local_repository)
|
|||||||
git_buf_sets(&file_path_buf, cl_git_path_url(local_repository));
|
git_buf_sets(&file_path_buf, cl_git_path_url(local_repository));
|
||||||
|
|
||||||
cl_git_pass(git_remote_create_anonymous(&remote, repo, git_buf_cstr(&file_path_buf)));
|
cl_git_pass(git_remote_create_anonymous(&remote, repo, git_buf_cstr(&file_path_buf)));
|
||||||
cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL));
|
cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL, NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_network_remote_local__connected(void)
|
void test_network_remote_local__connected(void)
|
||||||
@ -214,7 +214,7 @@ void test_network_remote_local__push_to_bare_remote(void)
|
|||||||
|
|
||||||
/* Connect to the bare repo */
|
/* Connect to the bare repo */
|
||||||
cl_git_pass(git_remote_create_anonymous(&localremote, repo, "./localbare.git"));
|
cl_git_pass(git_remote_create_anonymous(&localremote, repo, "./localbare.git"));
|
||||||
cl_git_pass(git_remote_connect(localremote, GIT_DIRECTION_PUSH, NULL));
|
cl_git_pass(git_remote_connect(localremote, GIT_DIRECTION_PUSH, NULL, NULL));
|
||||||
|
|
||||||
/* Try to push */
|
/* Try to push */
|
||||||
cl_git_pass(git_remote_upload(localremote, &push_array, NULL));
|
cl_git_pass(git_remote_upload(localremote, &push_array, NULL));
|
||||||
@ -253,7 +253,7 @@ void test_network_remote_local__push_to_bare_remote_with_file_url(void)
|
|||||||
|
|
||||||
/* Connect to the bare repo */
|
/* Connect to the bare repo */
|
||||||
cl_git_pass(git_remote_create_anonymous(&localremote, repo, url));
|
cl_git_pass(git_remote_create_anonymous(&localremote, repo, url));
|
||||||
cl_git_pass(git_remote_connect(localremote, GIT_DIRECTION_PUSH, NULL));
|
cl_git_pass(git_remote_connect(localremote, GIT_DIRECTION_PUSH, NULL, NULL));
|
||||||
|
|
||||||
/* Try to push */
|
/* Try to push */
|
||||||
cl_git_pass(git_remote_upload(localremote, &push_array, NULL));
|
cl_git_pass(git_remote_upload(localremote, &push_array, NULL));
|
||||||
@ -290,7 +290,7 @@ void test_network_remote_local__push_to_non_bare_remote(void)
|
|||||||
|
|
||||||
/* Connect to the bare repo */
|
/* Connect to the bare repo */
|
||||||
cl_git_pass(git_remote_create_anonymous(&localremote, repo, "./localnonbare"));
|
cl_git_pass(git_remote_create_anonymous(&localremote, repo, "./localnonbare"));
|
||||||
cl_git_pass(git_remote_connect(localremote, GIT_DIRECTION_PUSH, NULL));
|
cl_git_pass(git_remote_connect(localremote, GIT_DIRECTION_PUSH, NULL, NULL));
|
||||||
|
|
||||||
/* Try to push */
|
/* Try to push */
|
||||||
cl_git_fail_with(GIT_EBAREREPO, git_remote_upload(localremote, &push_array, NULL));
|
cl_git_fail_with(GIT_EBAREREPO, git_remote_upload(localremote, &push_array, NULL));
|
||||||
|
@ -93,7 +93,7 @@ void test_network_remote_remotes__error_when_no_push_available(void)
|
|||||||
cl_git_pass(git_remote_create_anonymous(&r, _repo, cl_fixture("testrepo.git")));
|
cl_git_pass(git_remote_create_anonymous(&r, _repo, cl_fixture("testrepo.git")));
|
||||||
|
|
||||||
callbacks.transport = git_transport_local;
|
callbacks.transport = git_transport_local;
|
||||||
cl_git_pass(git_remote_connect(r, GIT_DIRECTION_PUSH, &callbacks));
|
cl_git_pass(git_remote_connect(r, GIT_DIRECTION_PUSH, &callbacks, NULL));
|
||||||
|
|
||||||
/* Make sure that push is really not available */
|
/* Make sure that push is really not available */
|
||||||
r->transport->push = NULL;
|
r->transport->push = NULL;
|
||||||
@ -359,7 +359,7 @@ void test_network_remote_remotes__can_load_with_an_empty_url(void)
|
|||||||
cl_assert(remote->url == NULL);
|
cl_assert(remote->url == NULL);
|
||||||
cl_assert(remote->pushurl == NULL);
|
cl_assert(remote->pushurl == NULL);
|
||||||
|
|
||||||
cl_git_fail(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL));
|
cl_git_fail(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL, NULL));
|
||||||
|
|
||||||
cl_assert(giterr_last() != NULL);
|
cl_assert(giterr_last() != NULL);
|
||||||
cl_assert(giterr_last()->klass == GITERR_INVALID);
|
cl_assert(giterr_last()->klass == GITERR_INVALID);
|
||||||
@ -376,7 +376,7 @@ void test_network_remote_remotes__can_load_with_only_an_empty_pushurl(void)
|
|||||||
cl_assert(remote->url == NULL);
|
cl_assert(remote->url == NULL);
|
||||||
cl_assert(remote->pushurl == NULL);
|
cl_assert(remote->pushurl == NULL);
|
||||||
|
|
||||||
cl_git_fail(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL));
|
cl_git_fail(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL, NULL));
|
||||||
|
|
||||||
git_remote_free(remote);
|
git_remote_free(remote);
|
||||||
}
|
}
|
||||||
|
@ -213,6 +213,33 @@ void test_online_clone__custom_remote_callbacks(void)
|
|||||||
cl_assert(callcount > 0);
|
cl_assert(callcount > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_online_clone__custom_headers(void)
|
||||||
|
{
|
||||||
|
char *empty_header = "";
|
||||||
|
char *unnamed_header = "this is a header about nothing";
|
||||||
|
char *newlines = "X-Custom: almost OK\n";
|
||||||
|
char *conflict = "Accept: defined-by-git";
|
||||||
|
char *ok = "X-Custom: this should be ok";
|
||||||
|
|
||||||
|
g_options.fetch_opts.custom_headers.count = 1;
|
||||||
|
|
||||||
|
g_options.fetch_opts.custom_headers.strings = &empty_header;
|
||||||
|
cl_git_fail(git_clone(&g_repo, LIVE_REPO_URL, "./foo", &g_options));
|
||||||
|
|
||||||
|
g_options.fetch_opts.custom_headers.strings = &unnamed_header;
|
||||||
|
cl_git_fail(git_clone(&g_repo, LIVE_REPO_URL, "./foo", &g_options));
|
||||||
|
|
||||||
|
g_options.fetch_opts.custom_headers.strings = &newlines;
|
||||||
|
cl_git_fail(git_clone(&g_repo, LIVE_REPO_URL, "./foo", &g_options));
|
||||||
|
|
||||||
|
g_options.fetch_opts.custom_headers.strings = &conflict;
|
||||||
|
cl_git_fail(git_clone(&g_repo, LIVE_REPO_URL, "./foo", &g_options));
|
||||||
|
|
||||||
|
/* Finally, we got it right! */
|
||||||
|
g_options.fetch_opts.custom_headers.strings = &ok;
|
||||||
|
cl_git_pass(git_clone(&g_repo, LIVE_REPO_URL, "./foo", &g_options));
|
||||||
|
}
|
||||||
|
|
||||||
static int cred_failure_cb(
|
static int cred_failure_cb(
|
||||||
git_cred **cred,
|
git_cred **cred,
|
||||||
const char *url,
|
const char *url,
|
||||||
|
@ -81,11 +81,11 @@ void test_online_fetch__fetch_twice(void)
|
|||||||
{
|
{
|
||||||
git_remote *remote;
|
git_remote *remote;
|
||||||
cl_git_pass(git_remote_create(&remote, _repo, "test", "git://github.com/libgit2/TestGitRepository.git"));
|
cl_git_pass(git_remote_create(&remote, _repo, "test", "git://github.com/libgit2/TestGitRepository.git"));
|
||||||
cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL));
|
cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL, NULL));
|
||||||
cl_git_pass(git_remote_download(remote, NULL, NULL));
|
cl_git_pass(git_remote_download(remote, NULL, NULL));
|
||||||
git_remote_disconnect(remote);
|
git_remote_disconnect(remote);
|
||||||
|
|
||||||
git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL);
|
git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL, NULL);
|
||||||
cl_git_pass(git_remote_download(remote, NULL, NULL));
|
cl_git_pass(git_remote_download(remote, NULL, NULL));
|
||||||
git_remote_disconnect(remote);
|
git_remote_disconnect(remote);
|
||||||
|
|
||||||
@ -117,7 +117,7 @@ void test_online_fetch__doesnt_retrieve_a_pack_when_the_repository_is_up_to_date
|
|||||||
cl_git_pass(git_repository_open(&_repository, "./fetch/lg2"));
|
cl_git_pass(git_repository_open(&_repository, "./fetch/lg2"));
|
||||||
|
|
||||||
cl_git_pass(git_remote_lookup(&remote, _repository, "origin"));
|
cl_git_pass(git_remote_lookup(&remote, _repository, "origin"));
|
||||||
cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL));
|
cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL, NULL));
|
||||||
|
|
||||||
cl_assert_equal_i(false, invoked);
|
cl_assert_equal_i(false, invoked);
|
||||||
|
|
||||||
@ -155,7 +155,7 @@ void test_online_fetch__can_cancel(void)
|
|||||||
options.callbacks.transfer_progress = cancel_at_half;
|
options.callbacks.transfer_progress = cancel_at_half;
|
||||||
options.callbacks.payload = &bytes_received;
|
options.callbacks.payload = &bytes_received;
|
||||||
|
|
||||||
cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL));
|
cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL, NULL));
|
||||||
cl_git_fail_with(git_remote_download(remote, NULL, &options), -4321);
|
cl_git_fail_with(git_remote_download(remote, NULL, &options), -4321);
|
||||||
git_remote_disconnect(remote);
|
git_remote_disconnect(remote);
|
||||||
git_remote_free(remote);
|
git_remote_free(remote);
|
||||||
@ -169,7 +169,7 @@ void test_online_fetch__ls_disconnected(void)
|
|||||||
|
|
||||||
cl_git_pass(git_remote_create(&remote, _repo, "test",
|
cl_git_pass(git_remote_create(&remote, _repo, "test",
|
||||||
"http://github.com/libgit2/TestGitRepository.git"));
|
"http://github.com/libgit2/TestGitRepository.git"));
|
||||||
cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL));
|
cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL, NULL));
|
||||||
cl_git_pass(git_remote_ls(&refs, &refs_len_before, remote));
|
cl_git_pass(git_remote_ls(&refs, &refs_len_before, remote));
|
||||||
git_remote_disconnect(remote);
|
git_remote_disconnect(remote);
|
||||||
cl_git_pass(git_remote_ls(&refs, &refs_len_after, remote));
|
cl_git_pass(git_remote_ls(&refs, &refs_len_after, remote));
|
||||||
@ -187,7 +187,7 @@ void test_online_fetch__remote_symrefs(void)
|
|||||||
|
|
||||||
cl_git_pass(git_remote_create(&remote, _repo, "test",
|
cl_git_pass(git_remote_create(&remote, _repo, "test",
|
||||||
"http://github.com/libgit2/TestGitRepository.git"));
|
"http://github.com/libgit2/TestGitRepository.git"));
|
||||||
cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL));
|
cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL, NULL));
|
||||||
git_remote_disconnect(remote);
|
git_remote_disconnect(remote);
|
||||||
cl_git_pass(git_remote_ls(&refs, &refs_len, remote));
|
cl_git_pass(git_remote_ls(&refs, &refs_len, remote));
|
||||||
|
|
||||||
|
@ -372,7 +372,7 @@ void test_online_push__initialize(void)
|
|||||||
|
|
||||||
record_callbacks_data_clear(&_record_cbs_data);
|
record_callbacks_data_clear(&_record_cbs_data);
|
||||||
|
|
||||||
cl_git_pass(git_remote_connect(_remote, GIT_DIRECTION_PUSH, &_record_cbs));
|
cl_git_pass(git_remote_connect(_remote, GIT_DIRECTION_PUSH, &_record_cbs, NULL));
|
||||||
|
|
||||||
/* Clean up previously pushed branches. Fails if receive.denyDeletes is
|
/* Clean up previously pushed branches. Fails if receive.denyDeletes is
|
||||||
* set on the remote. Also, on Git 1.7.0 and newer, you must run
|
* set on the remote. Also, on Git 1.7.0 and newer, you must run
|
||||||
|
Loading…
Reference in New Issue
Block a user