summaryrefslogtreecommitdiff
path: root/tests/refs/peel.c
blob: 09809e19e2e2648e0350416735338cf92a584f05 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include "clar_libgit2.h"

static git_repository *g_repo;
static git_repository *g_peel_repo;

void test_refs_peel__initialize(void)
{
	cl_git_pass(git_repository_open(&g_repo, cl_fixture("testrepo.git")));
	cl_git_pass(git_repository_open(&g_peel_repo, cl_fixture("peeled.git")));
}

void test_refs_peel__cleanup(void)
{
	git_repository_free(g_repo);
	g_repo = NULL;
	git_repository_free(g_peel_repo);
	g_peel_repo = NULL;
}

static void assert_peel_generic(
	git_repository *repo,
	const char *ref_name,
	git_otype requested_type,
	const char* expected_sha,
	git_otype expected_type)
{
	git_oid expected_oid;
	git_reference *ref;
	git_object *peeled;

	cl_git_pass(git_reference_lookup(&ref, repo, ref_name));
	
	cl_git_pass(git_reference_peel(&peeled, ref, requested_type));

	cl_git_pass(git_oid_fromstr(&expected_oid, expected_sha));
	cl_assert_equal_oid(&expected_oid, git_object_id(peeled));

	cl_assert_equal_i(expected_type, git_object_type(peeled));

	git_object_free(peeled);
	git_reference_free(ref);
}

static void assert_peel(
	const char *ref_name,
	git_otype requested_type,
	const char* expected_sha,
	git_otype expected_type)
{
	assert_peel_generic(g_repo, ref_name, requested_type,
			    expected_sha, expected_type);
}

static void assert_peel_error(int error, const char *ref_name, git_otype requested_type)
{
	git_reference *ref;
	git_object *peeled;

	cl_git_pass(git_reference_lookup(&ref, g_repo, ref_name));
	
	cl_assert_equal_i(error, git_reference_peel(&peeled, ref, requested_type));

	git_reference_free(ref);
}

void test_refs_peel__can_peel_a_tag(void)
{
	assert_peel("refs/tags/test", GIT_OBJ_TAG,
		"b25fa35b38051e4ae45d4222e795f9df2e43f1d1", GIT_OBJ_TAG);
	assert_peel("refs/tags/test", GIT_OBJ_COMMIT,
		"e90810b8df3e80c413d903f631643c716887138d", GIT_OBJ_COMMIT);
	assert_peel("refs/tags/test", GIT_OBJ_TREE,
		"53fc32d17276939fc79ed05badaef2db09990016", GIT_OBJ_TREE);
	assert_peel("refs/tags/point_to_blob", GIT_OBJ_BLOB,
		"1385f264afb75a56a5bec74243be9b367ba4ca08", GIT_OBJ_BLOB);
}

void test_refs_peel__can_peel_a_branch(void)
{
	assert_peel("refs/heads/master", GIT_OBJ_COMMIT,
		"a65fedf39aefe402d3bb6e24df4d4f5fe4547750", GIT_OBJ_COMMIT);
	assert_peel("refs/heads/master", GIT_OBJ_TREE,
		"944c0f6e4dfa41595e6eb3ceecdb14f50fe18162", GIT_OBJ_TREE);
}

void test_refs_peel__can_peel_a_symbolic_reference(void)
{
	assert_peel("HEAD", GIT_OBJ_COMMIT,
		"a65fedf39aefe402d3bb6e24df4d4f5fe4547750", GIT_OBJ_COMMIT);
	assert_peel("HEAD", GIT_OBJ_TREE,
		"944c0f6e4dfa41595e6eb3ceecdb14f50fe18162", GIT_OBJ_TREE);
}

void test_refs_peel__cannot_peel_into_a_non_existing_target(void)
{
	assert_peel_error(GIT_EINVALIDSPEC, "refs/tags/point_to_blob", GIT_OBJ_TAG);
}

void test_refs_peel__can_peel_into_any_non_tag_object(void)
{
	assert_peel("refs/heads/master", GIT_OBJ_ANY,
		"a65fedf39aefe402d3bb6e24df4d4f5fe4547750", GIT_OBJ_COMMIT);
	assert_peel("refs/tags/point_to_blob", GIT_OBJ_ANY,
		"1385f264afb75a56a5bec74243be9b367ba4ca08", GIT_OBJ_BLOB);
	assert_peel("refs/tags/test", GIT_OBJ_ANY,
		"e90810b8df3e80c413d903f631643c716887138d", GIT_OBJ_COMMIT);
}

void test_refs_peel__can_peel_fully_peeled_packed_refs(void)
{
	assert_peel_generic(g_peel_repo,
			    "refs/tags/tag-inside-tags", GIT_OBJ_ANY,
			    "0df1a5865c8abfc09f1f2182e6a31be550e99f07",
			    GIT_OBJ_COMMIT);
	assert_peel_generic(g_peel_repo,
			    "refs/foo/tag-outside-tags", GIT_OBJ_ANY,
			    "0df1a5865c8abfc09f1f2182e6a31be550e99f07",
			    GIT_OBJ_COMMIT);
}

void test_refs_peel__can_peel_fully_peeled_tag_to_tag(void)
{
	assert_peel_generic(g_peel_repo,
			    "refs/tags/tag-inside-tags", GIT_OBJ_TAG,
			    "c2596aa0151888587ec5c0187f261e63412d9e11",
			    GIT_OBJ_TAG);
	assert_peel_generic(g_peel_repo,
			    "refs/foo/tag-outside-tags", GIT_OBJ_TAG,
			    "c2596aa0151888587ec5c0187f261e63412d9e11",
			    GIT_OBJ_TAG);
}