mirror of
https://git.proxmox.com/git/libgit2
synced 2026-03-26 01:37:32 +00:00
Having the setting be different from calling its actions was not a great idea and made for the sake of the wrong convenience. Instead of that, accept either fetch options, push options or the callbacks when dealing with the remote. The fetch options are currently only the callbacks, but more options will be moved from setters and getters on the remote to the options. This does mean passing the same struct along the different functions but the typical use-case will only call git_remote_fetch() or git_remote_push() and so won't notice much difference.
103 lines
2.8 KiB
C
103 lines
2.8 KiB
C
#include "clar_libgit2.h"
|
|
|
|
#include "fileops.h"
|
|
#include "fetchhead.h"
|
|
#include "../fetchhead/fetchhead_data.h"
|
|
#include "git2/clone.h"
|
|
|
|
#define LIVE_REPO_URL "git://github.com/libgit2/TestGitRepository"
|
|
|
|
static git_repository *g_repo;
|
|
static git_clone_options g_options;
|
|
|
|
void test_online_fetchhead__initialize(void)
|
|
{
|
|
git_fetch_options dummy_fetch = GIT_FETCH_OPTIONS_INIT;
|
|
g_repo = NULL;
|
|
|
|
memset(&g_options, 0, sizeof(git_clone_options));
|
|
g_options.version = GIT_CLONE_OPTIONS_VERSION;
|
|
g_options.fetch_opts = dummy_fetch;
|
|
}
|
|
|
|
void test_online_fetchhead__cleanup(void)
|
|
{
|
|
if (g_repo) {
|
|
git_repository_free(g_repo);
|
|
g_repo = NULL;
|
|
}
|
|
|
|
cl_fixture_cleanup("./foo");
|
|
}
|
|
|
|
static void fetchhead_test_clone(void)
|
|
{
|
|
cl_git_pass(git_clone(&g_repo, LIVE_REPO_URL, "./foo", &g_options));
|
|
}
|
|
|
|
static void fetchhead_test_fetch(const char *fetchspec, const char *expected_fetchhead)
|
|
{
|
|
git_remote *remote;
|
|
git_buf fetchhead_buf = GIT_BUF_INIT;
|
|
int equals = 0;
|
|
git_strarray array, *active_refs = NULL;
|
|
|
|
cl_git_pass(git_remote_lookup(&remote, g_repo, "origin"));
|
|
git_remote_set_autotag(remote, GIT_REMOTE_DOWNLOAD_TAGS_AUTO);
|
|
|
|
if(fetchspec != NULL) {
|
|
array.count = 1;
|
|
array.strings = (char **) &fetchspec;
|
|
active_refs = &array;
|
|
}
|
|
|
|
cl_git_pass(git_remote_fetch(remote, active_refs, NULL, NULL));
|
|
git_remote_free(remote);
|
|
|
|
cl_git_pass(git_futils_readbuffer(&fetchhead_buf, "./foo/.git/FETCH_HEAD"));
|
|
|
|
equals = (strcmp(fetchhead_buf.ptr, expected_fetchhead) == 0);
|
|
|
|
git_buf_free(&fetchhead_buf);
|
|
|
|
cl_assert(equals);
|
|
}
|
|
|
|
void test_online_fetchhead__wildcard_spec(void)
|
|
{
|
|
fetchhead_test_clone();
|
|
fetchhead_test_fetch(NULL, FETCH_HEAD_WILDCARD_DATA2);
|
|
cl_git_pass(git_tag_delete(g_repo, "annotated_tag"));
|
|
cl_git_pass(git_tag_delete(g_repo, "blob"));
|
|
cl_git_pass(git_tag_delete(g_repo, "commit_tree"));
|
|
cl_git_pass(git_tag_delete(g_repo, "nearly-dangling"));
|
|
fetchhead_test_fetch(NULL, FETCH_HEAD_WILDCARD_DATA);
|
|
}
|
|
|
|
void test_online_fetchhead__explicit_spec(void)
|
|
{
|
|
fetchhead_test_clone();
|
|
fetchhead_test_fetch("refs/heads/first-merge:refs/remotes/origin/first-merge", FETCH_HEAD_EXPLICIT_DATA);
|
|
}
|
|
|
|
void test_online_fetchhead__no_merges(void)
|
|
{
|
|
git_config *config;
|
|
|
|
fetchhead_test_clone();
|
|
|
|
cl_git_pass(git_repository_config(&config, g_repo));
|
|
cl_git_pass(git_config_delete_entry(config, "branch.master.remote"));
|
|
cl_git_pass(git_config_delete_entry(config, "branch.master.merge"));
|
|
git_config_free(config);
|
|
|
|
fetchhead_test_fetch(NULL, FETCH_HEAD_NO_MERGE_DATA2);
|
|
cl_git_pass(git_tag_delete(g_repo, "annotated_tag"));
|
|
cl_git_pass(git_tag_delete(g_repo, "blob"));
|
|
cl_git_pass(git_tag_delete(g_repo, "commit_tree"));
|
|
cl_git_pass(git_tag_delete(g_repo, "nearly-dangling"));
|
|
fetchhead_test_fetch(NULL, FETCH_HEAD_NO_MERGE_DATA);
|
|
cl_git_pass(git_tag_delete(g_repo, "commit_tree"));
|
|
fetchhead_test_fetch(NULL, FETCH_HEAD_NO_MERGE_DATA3);
|
|
}
|