static void add_conflicts(git_index *index, const char *filename) { git_index_entry ancestor_entry, our_entry, their_entry; static int conflict_idx = 0; char *ancestor_ids[] = { CONFLICTS_ONE_ANCESTOR_OID, CONFLICTS_TWO_ANCESTOR_OID }; char *our_ids[] = { CONFLICTS_ONE_OUR_OID, CONFLICTS_TWO_OUR_OID }; char *their_ids[] = { CONFLICTS_ONE_THEIR_OID, CONFLICTS_TWO_THEIR_OID }; conflict_idx = (conflict_idx + 1) % 2; 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 = filename; ancestor_entry.mode = 0100644; GIT_IDXENTRY_STAGE_SET(&ancestor_entry, 1); git_oid_fromstr(&ancestor_entry.id, ancestor_ids[conflict_idx]); our_entry.path = filename; our_entry.mode = 0100644; GIT_IDXENTRY_STAGE_SET(&our_entry, 2); git_oid_fromstr(&our_entry.id, our_ids[conflict_idx]); their_entry.path = filename; their_entry.mode = 0100644; GIT_IDXENTRY_STAGE_SET(&ancestor_entry, 2); git_oid_fromstr(&their_entry.id, their_ids[conflict_idx]); cl_git_pass(git_index_conflict_add(index, &ancestor_entry, &our_entry, &their_entry)); }
static void create_conflict(const char *path) { git_index *index; git_index_entry entry; cl_git_pass(git_repository_index(&index, g_repo)); memset(&entry, 0x0, sizeof(git_index_entry)); entry.mode = 0100644; GIT_IDXENTRY_STAGE_SET(&entry, 1); git_oid_fromstr(&entry.id, "d427e0b2e138501a3d15cc376077a3631e15bd46"); entry.path = path; cl_git_pass(git_index_add(index, &entry)); GIT_IDXENTRY_STAGE_SET(&entry, 2); git_oid_fromstr(&entry.id, "ee3fa1b8c00aff7fe02065fdb50864bb0d932ccf"); cl_git_pass(git_index_add(index, &entry)); GIT_IDXENTRY_STAGE_SET(&entry, 3); git_oid_fromstr(&entry.id, "2bd0a343aeef7a2cf0d158478966a6e587ff3863"); cl_git_pass(git_index_add(index, &entry)); git_index_write(index); git_index_free(index); }
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"; ancestor_entry.mode = 0100644; GIT_IDXENTRY_STAGE_SET(&ancestor_entry, 1); git_oid_fromstr(&ancestor_entry.id, TEST_ANCESTOR_OID); our_entry.path = "test-one.txt"; our_entry.mode = 0100644; GIT_IDXENTRY_STAGE_SET(&our_entry, 2); git_oid_fromstr(&our_entry.id, TEST_OUR_OID); their_entry.path = "test-one.txt"; their_entry.mode = 0100644; GIT_IDXENTRY_STAGE_SET(&ancestor_entry, 2); 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); }
void test_index_collision__add_with_highstage_2(void) { git_index_entry entry; memset(&entry, 0, sizeof(entry)); entry.ctime.seconds = 12346789; entry.mtime.seconds = 12346789; entry.mode = 0100644; entry.file_size = 0; git_oid_cpy(&entry.id, &g_empty_id); entry.path = "a/b/c"; GIT_IDXENTRY_STAGE_SET(&entry, 1); cl_git_pass(git_index_add(g_index, &entry)); /* create a blob beneath the previous tree entry */ entry.path = "a/b/c"; GIT_IDXENTRY_STAGE_SET(&entry, 2); cl_git_pass(git_index_add(g_index, &entry)); /* create another tree entry above the blob */ entry.path = "a/b"; GIT_IDXENTRY_STAGE_SET(&entry, 3); cl_git_pass(git_index_add(g_index, &entry)); }
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"; staged.mode = 0100644; 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; GIT_IDXENTRY_STAGE_SET(&ancestor_entry, 3); git_oid_fromstr(&ancestor_entry.id, TEST_ANCESTOR_OID); our_entry.path = "test-one.txt"; our_entry.mode = 0100644; GIT_IDXENTRY_STAGE_SET(&our_entry, 1); git_oid_fromstr(&our_entry.id, TEST_OUR_OID); their_entry.path = "test-one.txt"; their_entry.mode = 0100644; GIT_IDXENTRY_STAGE_SET(&their_entry, 2); 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])); }
static void create_index(struct checkout_index_entry *entries, size_t entries_len) { git_buf path = GIT_BUF_INIT; size_t i; for (i = 0; i < entries_len; i++) { git_buf_joinpath(&path, TEST_REPO_PATH, entries[i].path); if (entries[i].stage == 3 && (i == 0 || strcmp(entries[i-1].path, entries[i].path) != 0 || entries[i-1].stage != 2)) p_unlink(git_buf_cstr(&path)); git_index_remove_bypath(g_index, entries[i].path); } for (i = 0; i < entries_len; i++) { git_index_entry entry; memset(&entry, 0x0, sizeof(git_index_entry)); entry.mode = entries[i].mode; GIT_IDXENTRY_STAGE_SET(&entry, entries[i].stage); git_oid_fromstr(&entry.id, entries[i].oid_str); entry.path = entries[i].path; cl_git_pass(git_index_add(g_index, &entry)); } git_buf_free(&path); }
void test_index_conflicts__partial(void) { git_index_entry ancestor_entry, our_entry, their_entry; const git_index_entry *conflict_entry[3]; 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"; ancestor_entry.mode = 0100644; GIT_IDXENTRY_STAGE_SET(&ancestor_entry, 1); git_oid_fromstr(&ancestor_entry.id, TEST_ANCESTOR_OID); 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")); cl_assert_equal_oid(&ancestor_entry.id, &conflict_entry[0]->id); cl_assert(conflict_entry[1] == NULL); cl_assert(conflict_entry[2] == NULL); }
static void add_conflict(git_index *index, const char *path) { git_index_entry entry; memset(&entry, 0, sizeof(git_index_entry)); entry.mode = 0100644; entry.path = path; git_oid_fromstr(&entry.id, "d427e0b2e138501a3d15cc376077a3631e15bd46"); GIT_IDXENTRY_STAGE_SET(&entry, 1); cl_git_pass(git_index_add(index, &entry)); git_oid_fromstr(&entry.id, "4e886e602529caa9ab11d71f86634bd1b6e0de10"); GIT_IDXENTRY_STAGE_SET(&entry, 2); cl_git_pass(git_index_add(index, &entry)); git_oid_fromstr(&entry.id, "2bd0a343aeef7a2cf0d158478966a6e587ff3863"); GIT_IDXENTRY_STAGE_SET(&entry, 3); cl_git_pass(git_index_add(index, &entry)); }
void test_index_conflicts__add_fixes_incorrect_stage(void) { git_index_entry ancestor_entry, our_entry, their_entry; const git_index_entry *conflict_entry[3]; 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"; ancestor_entry.mode = 0100644; GIT_IDXENTRY_STAGE_SET(&ancestor_entry, 3); git_oid_fromstr(&ancestor_entry.id, TEST_ANCESTOR_OID); our_entry.path = "test-one.txt"; our_entry.mode = 0100644; GIT_IDXENTRY_STAGE_SET(&our_entry, 1); git_oid_fromstr(&our_entry.id, TEST_OUR_OID); their_entry.path = "test-one.txt"; their_entry.mode = 0100644; GIT_IDXENTRY_STAGE_SET(&their_entry, 2); 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_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); }
void test_index_conflicts__case_matters(void) { const git_index_entry *conflict_entry[3]; git_oid oid; const char *upper_case = "DIFFERS-IN-CASE.TXT"; const char *mixed_case = "Differs-In-Case.txt"; const char *correct_case; bool ignorecase = cl_repo_get_bool(repo, "core.ignorecase"); git_index_entry ancestor_entry, our_entry, their_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)); ancestor_entry.path = upper_case; GIT_IDXENTRY_STAGE_SET(&ancestor_entry, GIT_INDEX_STAGE_ANCESTOR); git_oid_fromstr(&ancestor_entry.id, CONFLICTS_ONE_ANCESTOR_OID); ancestor_entry.mode = GIT_FILEMODE_BLOB; our_entry.path = upper_case; GIT_IDXENTRY_STAGE_SET(&our_entry, GIT_INDEX_STAGE_OURS); git_oid_fromstr(&our_entry.id, CONFLICTS_ONE_OUR_OID); our_entry.mode = GIT_FILEMODE_BLOB; their_entry.path = upper_case; GIT_IDXENTRY_STAGE_SET(&their_entry, GIT_INDEX_STAGE_THEIRS); git_oid_fromstr(&their_entry.id, CONFLICTS_ONE_THEIR_OID); their_entry.mode = GIT_FILEMODE_BLOB; cl_git_pass(git_index_conflict_add(repo_index, &ancestor_entry, &our_entry, &their_entry)); ancestor_entry.path = mixed_case; GIT_IDXENTRY_STAGE_SET(&ancestor_entry, GIT_INDEX_STAGE_ANCESTOR); git_oid_fromstr(&ancestor_entry.id, CONFLICTS_TWO_ANCESTOR_OID); ancestor_entry.mode = GIT_FILEMODE_BLOB; our_entry.path = mixed_case; GIT_IDXENTRY_STAGE_SET(&ancestor_entry, GIT_INDEX_STAGE_ANCESTOR); git_oid_fromstr(&our_entry.id, CONFLICTS_TWO_OUR_OID); ancestor_entry.mode = GIT_FILEMODE_BLOB; their_entry.path = mixed_case; GIT_IDXENTRY_STAGE_SET(&their_entry, GIT_INDEX_STAGE_THEIRS); git_oid_fromstr(&their_entry.id, CONFLICTS_TWO_THEIR_OID); their_entry.mode = GIT_FILEMODE_BLOB; cl_git_pass(git_index_conflict_add(repo_index, &ancestor_entry, &our_entry, &their_entry)); cl_git_pass(git_index_conflict_get(&conflict_entry[0], &conflict_entry[1], &conflict_entry[2], repo_index, upper_case)); /* * We inserted with mixed case last, so on a case-insensitive * fs we should get the mixed case. */ if (ignorecase) correct_case = mixed_case; else correct_case = upper_case; cl_assert_equal_s(correct_case, conflict_entry[0]->path); git_oid_fromstr(&oid, ignorecase ? CONFLICTS_TWO_ANCESTOR_OID : CONFLICTS_ONE_ANCESTOR_OID); cl_assert_equal_oid(&oid, &conflict_entry[0]->id); cl_assert_equal_s(correct_case, conflict_entry[1]->path); git_oid_fromstr(&oid, ignorecase ? CONFLICTS_TWO_OUR_OID : CONFLICTS_ONE_OUR_OID); cl_assert_equal_oid(&oid, &conflict_entry[1]->id); cl_assert_equal_s(correct_case, conflict_entry[2]->path); git_oid_fromstr(&oid, ignorecase ? CONFLICTS_TWO_THEIR_OID : CONFLICTS_ONE_THEIR_OID); cl_assert_equal_oid(&oid, &conflict_entry[2]->id); cl_git_pass(git_index_conflict_get(&conflict_entry[0], &conflict_entry[1], &conflict_entry[2], repo_index, mixed_case)); cl_assert_equal_s(mixed_case, conflict_entry[0]->path); git_oid_fromstr(&oid, CONFLICTS_TWO_ANCESTOR_OID); cl_assert_equal_oid(&oid, &conflict_entry[0]->id); cl_assert_equal_s(mixed_case, conflict_entry[1]->path); git_oid_fromstr(&oid, CONFLICTS_TWO_OUR_OID); cl_assert_equal_oid(&oid, &conflict_entry[1]->id); cl_assert_equal_s(mixed_case, conflict_entry[2]->path); git_oid_fromstr(&oid, CONFLICTS_TWO_THEIR_OID); cl_assert_equal_oid(&oid, &conflict_entry[2]->id); }