mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-03 06:17:02 +00:00

The signature for the reflog is not something which changes dynamically. Almost all uses will be NULL, since we want for the repository's default identity to be used, making it noise. In order to allow for changing the identity, we instead provide git_repository_set_ident() and git_repository_ident() which allow a user to override the choice of signature.
152 lines
3.6 KiB
C
152 lines
3.6 KiB
C
#include "clar_libgit2.h"
|
|
#include "refs.h"
|
|
|
|
static git_repository *repo;
|
|
static git_reference *fake_remote;
|
|
|
|
void test_refs_branches_iterator__initialize(void)
|
|
{
|
|
git_oid id;
|
|
|
|
cl_fixture_sandbox("testrepo.git");
|
|
cl_git_pass(git_repository_open(&repo, "testrepo.git"));
|
|
|
|
cl_git_pass(git_oid_fromstr(&id, "be3563ae3f795b2b4353bcce3a527ad0a4f7f644"));
|
|
cl_git_pass(git_reference_create(&fake_remote, repo, "refs/remotes/nulltoken/master", &id, 0, NULL));
|
|
}
|
|
|
|
void test_refs_branches_iterator__cleanup(void)
|
|
{
|
|
git_reference_free(fake_remote);
|
|
fake_remote = NULL;
|
|
|
|
git_repository_free(repo);
|
|
repo = NULL;
|
|
|
|
cl_fixture_cleanup("testrepo.git");
|
|
|
|
cl_git_sandbox_cleanup();
|
|
}
|
|
|
|
static void assert_retrieval(unsigned int flags, unsigned int expected_count)
|
|
{
|
|
git_branch_iterator *iter;
|
|
git_reference *ref;
|
|
int count = 0, error;
|
|
git_branch_t type;
|
|
|
|
cl_git_pass(git_branch_iterator_new(&iter, repo, flags));
|
|
while ((error = git_branch_next(&ref, &type, iter)) == 0) {
|
|
count++;
|
|
git_reference_free(ref);
|
|
}
|
|
|
|
git_branch_iterator_free(iter);
|
|
cl_assert_equal_i(error, GIT_ITEROVER);
|
|
cl_assert_equal_i(expected_count, count);
|
|
}
|
|
|
|
void test_refs_branches_iterator__retrieve_all_branches(void)
|
|
{
|
|
assert_retrieval(GIT_BRANCH_ALL, 14);
|
|
}
|
|
|
|
void test_refs_branches_iterator__retrieve_remote_branches(void)
|
|
{
|
|
assert_retrieval(GIT_BRANCH_REMOTE, 2);
|
|
}
|
|
|
|
void test_refs_branches_iterator__retrieve_local_branches(void)
|
|
{
|
|
assert_retrieval(GIT_BRANCH_LOCAL, 12);
|
|
}
|
|
|
|
struct expectations {
|
|
const char *branch_name;
|
|
int encounters;
|
|
};
|
|
|
|
static void assert_branch_has_been_found(struct expectations *findings, const char* expected_branch_name)
|
|
{
|
|
int pos = 0;
|
|
|
|
for (pos = 0; findings[pos].branch_name; ++pos) {
|
|
if (strcmp(expected_branch_name, findings[pos].branch_name) == 0) {
|
|
cl_assert_equal_i(1, findings[pos].encounters);
|
|
return;
|
|
}
|
|
}
|
|
|
|
cl_fail("expected branch not found in list.");
|
|
}
|
|
|
|
static void contains_branches(struct expectations exp[], git_branch_iterator *iter)
|
|
{
|
|
git_reference *ref;
|
|
git_branch_t type;
|
|
int error, pos = 0;
|
|
|
|
while ((error = git_branch_next(&ref, &type, iter)) == 0) {
|
|
for (pos = 0; exp[pos].branch_name; ++pos) {
|
|
if (strcmp(git_reference_shorthand(ref), exp[pos].branch_name) == 0)
|
|
exp[pos].encounters++;
|
|
}
|
|
|
|
git_reference_free(ref);
|
|
}
|
|
|
|
cl_assert_equal_i(error, GIT_ITEROVER);
|
|
}
|
|
|
|
/*
|
|
* $ git branch -r
|
|
* nulltoken/HEAD -> nulltoken/master
|
|
* nulltoken/master
|
|
*/
|
|
void test_refs_branches_iterator__retrieve_remote_symbolic_HEAD_when_present(void)
|
|
{
|
|
git_branch_iterator *iter;
|
|
struct expectations exp[] = {
|
|
{ "nulltoken/HEAD", 0 },
|
|
{ "nulltoken/master", 0 },
|
|
{ NULL, 0 }
|
|
};
|
|
|
|
git_reference_free(fake_remote);
|
|
cl_git_pass(git_reference_symbolic_create(&fake_remote, repo, "refs/remotes/nulltoken/HEAD", "refs/remotes/nulltoken/master", 0, NULL));
|
|
|
|
assert_retrieval(GIT_BRANCH_REMOTE, 3);
|
|
|
|
cl_git_pass(git_branch_iterator_new(&iter, repo, GIT_BRANCH_REMOTE));
|
|
contains_branches(exp, iter);
|
|
git_branch_iterator_free(iter);
|
|
|
|
assert_branch_has_been_found(exp, "nulltoken/HEAD");
|
|
assert_branch_has_been_found(exp, "nulltoken/master");
|
|
}
|
|
|
|
void test_refs_branches_iterator__mix_of_packed_and_loose(void)
|
|
{
|
|
git_branch_iterator *iter;
|
|
struct expectations exp[] = {
|
|
{ "master", 0 },
|
|
{ "origin/HEAD", 0 },
|
|
{ "origin/master", 0 },
|
|
{ "origin/packed", 0 },
|
|
{ NULL, 0 }
|
|
};
|
|
git_repository *r2;
|
|
|
|
r2 = cl_git_sandbox_init("testrepo2");
|
|
|
|
cl_git_pass(git_branch_iterator_new(&iter, r2, GIT_BRANCH_ALL));
|
|
contains_branches(exp, iter);
|
|
|
|
git_branch_iterator_free(iter);
|
|
|
|
assert_branch_has_been_found(exp, "master");
|
|
assert_branch_has_been_found(exp, "origin/HEAD");
|
|
assert_branch_has_been_found(exp, "origin/master");
|
|
assert_branch_has_been_found(exp, "origin/packed");
|
|
}
|