conflicts.c 11.3 KB
Newer Older
Edward Thomson committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#include "clar_libgit2.h"
#include "index.h"
#include "git2/repository.h"

static git_repository *repo;
static git_index *repo_index;

#define TEST_REPO_PATH "mergedrepo"
#define TEST_INDEX_PATH TEST_REPO_PATH "/.git/index"

#define CONFLICTS_ONE_ANCESTOR_OID "1f85ca51b8e0aac893a621b61a9c2661d6aa6d81"
#define CONFLICTS_ONE_OUR_OID "6aea5f295304c36144ad6e9247a291b7f8112399"
#define CONFLICTS_ONE_THEIR_OID "516bd85f78061e09ccc714561d7b504672cb52da"

#define CONFLICTS_TWO_ANCESTOR_OID "84af62840be1b1c47b778a8a249f3ff45155038c"
#define CONFLICTS_TWO_OUR_OID "8b3f43d2402825c200f835ca1762413e386fd0b2"
#define CONFLICTS_TWO_THEIR_OID "220bd62631c8cf7a83ef39c6b94595f00517211e"

19
#define TEST_STAGED_OID "beefdadafeedabedcafedeedbabedeadbeaddeaf"
Edward Thomson committed
20 21 22 23 24 25 26 27 28 29 30 31 32 33
#define TEST_ANCESTOR_OID "f00ff00ff00ff00ff00ff00ff00ff00ff00ff00f"
#define TEST_OUR_OID "b44bb44bb44bb44bb44bb44bb44bb44bb44bb44b"
#define TEST_THEIR_OID "0123456789abcdef0123456789abcdef01234567"

// Fixture setup and teardown
void test_index_conflicts__initialize(void)
{
	repo = cl_git_sandbox_init("mergedrepo");
	git_repository_index(&repo_index, repo);
}

void test_index_conflicts__cleanup(void)
{
	git_index_free(repo_index);
34 35
	repo_index = NULL;

Edward Thomson committed
36 37 38 39 40 41 42 43 44 45 46 47 48 49
	cl_git_sandbox_cleanup();
}

void test_index_conflicts__add(void)
{
	git_index_entry ancestor_entry, our_entry, their_entry;

	cl_assert(git_index_entrycount(repo_index) == 8);

	memset(&ancestor_entry, 0x0, sizeof(git_index_entry));
	memset(&our_entry, 0x0, sizeof(git_index_entry));
	memset(&their_entry, 0x0, sizeof(git_index_entry));

	ancestor_entry.path = "test-one.txt";
50
	ancestor_entry.mode = 0100644;
51
	GIT_IDXENTRY_STAGE_SET(&ancestor_entry, 1);
52
	git_oid_fromstr(&ancestor_entry.id, TEST_ANCESTOR_OID);
Edward Thomson committed
53 54

	our_entry.path = "test-one.txt";
55
	our_entry.mode = 0100644;
56
	GIT_IDXENTRY_STAGE_SET(&our_entry, 2);
57
	git_oid_fromstr(&our_entry.id, TEST_OUR_OID);
Edward Thomson committed
58 59

	their_entry.path = "test-one.txt";
60
	their_entry.mode = 0100644;
61
	GIT_IDXENTRY_STAGE_SET(&ancestor_entry, 2);
62
	git_oid_fromstr(&their_entry.id, TEST_THEIR_OID);
Edward Thomson committed
63 64 65 66 67 68 69 70 71

	cl_git_pass(git_index_conflict_add(repo_index, &ancestor_entry, &our_entry, &their_entry));

	cl_assert(git_index_entrycount(repo_index) == 11);
}

void test_index_conflicts__add_fixes_incorrect_stage(void)
{
	git_index_entry ancestor_entry, our_entry, their_entry;
72
	const git_index_entry *conflict_entry[3];
Edward Thomson committed
73 74 75 76 77 78 79 80

	cl_assert(git_index_entrycount(repo_index) == 8);

	memset(&ancestor_entry, 0x0, sizeof(git_index_entry));
	memset(&our_entry, 0x0, sizeof(git_index_entry));
	memset(&their_entry, 0x0, sizeof(git_index_entry));

	ancestor_entry.path = "test-one.txt";
81
	ancestor_entry.mode = 0100644;
82
	GIT_IDXENTRY_STAGE_SET(&ancestor_entry, 3);
83
	git_oid_fromstr(&ancestor_entry.id, TEST_ANCESTOR_OID);
Edward Thomson committed
84 85

	our_entry.path = "test-one.txt";
86
	our_entry.mode = 0100644;
87
	GIT_IDXENTRY_STAGE_SET(&our_entry, 1);
88
	git_oid_fromstr(&our_entry.id, TEST_OUR_OID);
Edward Thomson committed
89 90

	their_entry.path = "test-one.txt";
91
	their_entry.mode = 0100644;
92
	GIT_IDXENTRY_STAGE_SET(&their_entry, 2);
93
	git_oid_fromstr(&their_entry.id, TEST_THEIR_OID);
Edward Thomson committed
94 95 96 97 98 99 100 101 102 103 104 105

	cl_git_pass(git_index_conflict_add(repo_index, &ancestor_entry, &our_entry, &their_entry));

	cl_assert(git_index_entrycount(repo_index) == 11);

	cl_git_pass(git_index_conflict_get(&conflict_entry[0], &conflict_entry[1], &conflict_entry[2], repo_index, "test-one.txt"));

	cl_assert(git_index_entry_stage(conflict_entry[0]) == 1);
	cl_assert(git_index_entry_stage(conflict_entry[1]) == 2);
	cl_assert(git_index_entry_stage(conflict_entry[2]) == 3);
}

106 107 108 109 110 111 112 113 114 115 116 117 118
void test_index_conflicts__add_removes_stage_zero(void)
{
	git_index_entry staged, ancestor_entry, our_entry, their_entry;
	const git_index_entry *conflict_entry[3];

	cl_assert(git_index_entrycount(repo_index) == 8);

	memset(&staged, 0x0, sizeof(git_index_entry));
	memset(&ancestor_entry, 0x0, sizeof(git_index_entry));
	memset(&our_entry, 0x0, sizeof(git_index_entry));
	memset(&their_entry, 0x0, sizeof(git_index_entry));

	staged.path = "test-one.txt";
119
	staged.mode = 0100644;
120 121 122 123 124 125
	git_oid_fromstr(&staged.id, TEST_STAGED_OID);
	cl_git_pass(git_index_add(repo_index, &staged));
	cl_assert(git_index_entrycount(repo_index) == 9);

	ancestor_entry.path = "test-one.txt";
	ancestor_entry.mode = 0100644;
126
	GIT_IDXENTRY_STAGE_SET(&ancestor_entry, 3);
127 128 129 130
	git_oid_fromstr(&ancestor_entry.id, TEST_ANCESTOR_OID);

	our_entry.path = "test-one.txt";
	our_entry.mode = 0100644;
131
	GIT_IDXENTRY_STAGE_SET(&our_entry, 1);
132 133 134 135
	git_oid_fromstr(&our_entry.id, TEST_OUR_OID);

	their_entry.path = "test-one.txt";
	their_entry.mode = 0100644;
136
	GIT_IDXENTRY_STAGE_SET(&their_entry, 2);
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
	git_oid_fromstr(&their_entry.id, TEST_THEIR_OID);

	cl_git_pass(git_index_conflict_add(repo_index, &ancestor_entry, &our_entry, &their_entry));

	cl_assert(git_index_entrycount(repo_index) == 11);

	cl_assert_equal_p(NULL, git_index_get_bypath(repo_index, "test-one.txt", 0));

	cl_git_pass(git_index_conflict_get(&conflict_entry[0], &conflict_entry[1], &conflict_entry[2], repo_index, "test-one.txt"));

	cl_assert_equal_oid(&ancestor_entry.id, &conflict_entry[0]->id);
	cl_assert_equal_i(1, git_index_entry_stage(conflict_entry[0]));
	cl_assert_equal_oid(&our_entry.id, &conflict_entry[1]->id);
	cl_assert_equal_i(2, git_index_entry_stage(conflict_entry[1]));
	cl_assert_equal_oid(&their_entry.id, &conflict_entry[2]->id);
	cl_assert_equal_i(3, git_index_entry_stage(conflict_entry[2]));
}

Edward Thomson committed
155 156
void test_index_conflicts__get(void)
{
157
	const git_index_entry *conflict_entry[3];
Edward Thomson committed
158 159 160 161 162
	git_oid oid;

	cl_git_pass(git_index_conflict_get(&conflict_entry[0], &conflict_entry[1],
		&conflict_entry[2], repo_index, "conflicts-one.txt"));

163
	cl_assert_equal_s("conflicts-one.txt", conflict_entry[0]->path);
Edward Thomson committed
164 165

	git_oid_fromstr(&oid, CONFLICTS_ONE_ANCESTOR_OID);
166
	cl_assert_equal_oid(&oid, &conflict_entry[0]->id);
Edward Thomson committed
167 168

	git_oid_fromstr(&oid, CONFLICTS_ONE_OUR_OID);
169
	cl_assert_equal_oid(&oid, &conflict_entry[1]->id);
Edward Thomson committed
170 171

	git_oid_fromstr(&oid, CONFLICTS_ONE_THEIR_OID);
172
	cl_assert_equal_oid(&oid, &conflict_entry[2]->id);
Edward Thomson committed
173 174 175 176

	cl_git_pass(git_index_conflict_get(&conflict_entry[0], &conflict_entry[1],
		&conflict_entry[2], repo_index, "conflicts-two.txt"));

177
	cl_assert_equal_s("conflicts-two.txt", conflict_entry[0]->path);
Edward Thomson committed
178 179

	git_oid_fromstr(&oid, CONFLICTS_TWO_ANCESTOR_OID);
180
	cl_assert_equal_oid(&oid, &conflict_entry[0]->id);
Edward Thomson committed
181 182

	git_oid_fromstr(&oid, CONFLICTS_TWO_OUR_OID);
183
	cl_assert_equal_oid(&oid, &conflict_entry[1]->id);
Edward Thomson committed
184 185

	git_oid_fromstr(&oid, CONFLICTS_TWO_THEIR_OID);
186
	cl_assert_equal_oid(&oid, &conflict_entry[2]->id);
Edward Thomson committed
187 188
}

189 190 191 192 193 194 195 196 197 198 199
void test_index_conflicts__iterate(void)
{
	git_index_conflict_iterator *iterator;
	const git_index_entry *conflict_entry[3];
	git_oid oid;

	cl_git_pass(git_index_conflict_iterator_new(&iterator, repo_index));

	cl_git_pass(git_index_conflict_next(&conflict_entry[0], &conflict_entry[1], &conflict_entry[2], iterator));

	git_oid_fromstr(&oid, CONFLICTS_ONE_ANCESTOR_OID);
200
	cl_assert_equal_oid(&oid, &conflict_entry[0]->id);
201 202 203
	cl_assert(git__strcmp(conflict_entry[0]->path, "conflicts-one.txt") == 0);

	git_oid_fromstr(&oid, CONFLICTS_ONE_OUR_OID);
204
	cl_assert_equal_oid(&oid, &conflict_entry[1]->id);
205 206 207
	cl_assert(git__strcmp(conflict_entry[0]->path, "conflicts-one.txt") == 0);

	git_oid_fromstr(&oid, CONFLICTS_ONE_THEIR_OID);
208
	cl_assert_equal_oid(&oid, &conflict_entry[2]->id);
209 210 211 212 213
	cl_assert(git__strcmp(conflict_entry[0]->path, "conflicts-one.txt") == 0);

	cl_git_pass(git_index_conflict_next(&conflict_entry[0], &conflict_entry[1], &conflict_entry[2], iterator));

	git_oid_fromstr(&oid, CONFLICTS_TWO_ANCESTOR_OID);
214
	cl_assert_equal_oid(&oid, &conflict_entry[0]->id);
215 216 217
	cl_assert(git__strcmp(conflict_entry[0]->path, "conflicts-two.txt") == 0);

	git_oid_fromstr(&oid, CONFLICTS_TWO_OUR_OID);
218
	cl_assert_equal_oid(&oid, &conflict_entry[1]->id);
219 220 221
	cl_assert(git__strcmp(conflict_entry[0]->path, "conflicts-two.txt") == 0);

	git_oid_fromstr(&oid, CONFLICTS_TWO_THEIR_OID);
222
	cl_assert_equal_oid(&oid, &conflict_entry[2]->id);
223 224 225 226 227 228 229 230 231 232 233
	cl_assert(git__strcmp(conflict_entry[0]->path, "conflicts-two.txt") == 0);

	cl_assert(git_index_conflict_next(&conflict_entry[0], &conflict_entry[1], &conflict_entry[2], iterator) == GIT_ITEROVER);

	cl_assert(conflict_entry[0] == NULL);
	cl_assert(conflict_entry[2] == NULL);
	cl_assert(conflict_entry[2] == NULL);

	git_index_conflict_iterator_free(iterator);
}

Edward Thomson committed
234 235
void test_index_conflicts__remove(void)
{
Ben Straub committed
236
	const git_index_entry *entry;
Edward Thomson committed
237
	size_t i;
238

Edward Thomson committed
239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257
	cl_assert(git_index_entrycount(repo_index) == 8);

	cl_git_pass(git_index_conflict_remove(repo_index, "conflicts-one.txt"));
	cl_assert(git_index_entrycount(repo_index) == 5);

	for (i = 0; i < git_index_entrycount(repo_index); i++) {
		cl_assert(entry = git_index_get_byindex(repo_index, i));
		cl_assert(strcmp(entry->path, "conflicts-one.txt") != 0);
	}

	cl_git_pass(git_index_conflict_remove(repo_index, "conflicts-two.txt"));
	cl_assert(git_index_entrycount(repo_index) == 2);

	for (i = 0; i < git_index_entrycount(repo_index); i++) {
		cl_assert(entry = git_index_get_byindex(repo_index, i));
		cl_assert(strcmp(entry->path, "conflicts-two.txt") != 0);
	}
}

258
void test_index_conflicts__moved_to_reuc_on_add(void)
Edward Thomson committed
259
{
Ben Straub committed
260
	const git_index_entry *entry;
Edward Thomson committed
261 262 263 264 265 266
	size_t i;

	cl_assert(git_index_entrycount(repo_index) == 8);

	cl_git_mkfile("./mergedrepo/conflicts-one.txt", "new-file\n");

267
	cl_git_pass(git_index_add_bypath(repo_index, "conflicts-one.txt"));
Edward Thomson committed
268 269 270 271 272 273 274

	cl_assert(git_index_entrycount(repo_index) == 6);

	for (i = 0; i < git_index_entrycount(repo_index); i++) {
		cl_assert(entry = git_index_get_byindex(repo_index, i));

		if (strcmp(entry->path, "conflicts-one.txt") == 0)
275
			cl_assert(!git_index_entry_is_conflict(entry));
Edward Thomson committed
276 277 278
	}
}

279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297
void test_index_conflicts__moved_to_reuc_on_remove(void)
{
	const git_index_entry *entry;
	size_t i;

	cl_assert(git_index_entrycount(repo_index) == 8);

	cl_git_pass(p_unlink("./mergedrepo/conflicts-one.txt"));

	cl_git_pass(git_index_remove_bypath(repo_index, "conflicts-one.txt"));

	cl_assert(git_index_entrycount(repo_index) == 5);

	for (i = 0; i < git_index_entrycount(repo_index); i++) {
		cl_assert(entry = git_index_get_byindex(repo_index, i));
		cl_assert(strcmp(entry->path, "conflicts-one.txt") != 0);
	}
}

Edward Thomson committed
298 299 300
void test_index_conflicts__remove_all_conflicts(void)
{
	size_t i;
Ben Straub committed
301
	const git_index_entry *entry;
Edward Thomson committed
302 303 304

	cl_assert(git_index_entrycount(repo_index) == 8);

305 306
	cl_assert_equal_i(true, git_index_has_conflicts(repo_index));

Edward Thomson committed
307 308
	git_index_conflict_cleanup(repo_index);

309 310
	cl_assert_equal_i(false, git_index_has_conflicts(repo_index));

Edward Thomson committed
311 312 313 314
	cl_assert(git_index_entrycount(repo_index) == 2);

	for (i = 0; i < git_index_entrycount(repo_index); i++) {
		cl_assert(entry = git_index_get_byindex(repo_index, i));
315
		cl_assert(!git_index_entry_is_conflict(entry));
Edward Thomson committed
316 317 318 319 320 321
	}
}

void test_index_conflicts__partial(void)
{
	git_index_entry ancestor_entry, our_entry, their_entry;
322
	const git_index_entry *conflict_entry[3];
Edward Thomson committed
323 324 325 326 327 328 329 330

	cl_assert(git_index_entrycount(repo_index) == 8);

	memset(&ancestor_entry, 0x0, sizeof(git_index_entry));
	memset(&our_entry, 0x0, sizeof(git_index_entry));
	memset(&their_entry, 0x0, sizeof(git_index_entry));

	ancestor_entry.path = "test-one.txt";
331
	ancestor_entry.mode = 0100644;
332
	GIT_IDXENTRY_STAGE_SET(&ancestor_entry, 1);
333
	git_oid_fromstr(&ancestor_entry.id, TEST_ANCESTOR_OID);
Edward Thomson committed
334 335 336 337 338 339 340

	cl_git_pass(git_index_conflict_add(repo_index, &ancestor_entry, NULL, NULL));
	cl_assert(git_index_entrycount(repo_index) == 9);

	cl_git_pass(git_index_conflict_get(&conflict_entry[0], &conflict_entry[1],
		&conflict_entry[2], repo_index, "test-one.txt"));

341
	cl_assert_equal_oid(&ancestor_entry.id, &conflict_entry[0]->id);
Edward Thomson committed
342 343 344
	cl_assert(conflict_entry[1] == NULL);
	cl_assert(conflict_entry[2] == NULL);
}