static void setup_uptodate_files(void) { git_buf path = GIT_BUF_INIT; git_index *index; const git_index_entry *a_entry; git_index_entry new_entry = {{0}}; cl_git_pass(git_repository_index(&index, g_repo)); cl_git_pass(git_buf_joinpath(&path, git_repository_workdir(g_repo), "A")); cl_git_mkfile(path.ptr, "A"); /* Put 'A' into the index */ cl_git_pass(git_index_add_bypath(index, "A")); cl_assert((a_entry = git_index_get_bypath(index, "A", 0))); /* Put 'B' into the index */ new_entry.path = "B"; new_entry.mode = GIT_FILEMODE_BLOB; git_oid_cpy(&new_entry.id, &a_entry->id); cl_git_pass(git_index_add(index, &new_entry)); /* Put 'C' into the index */ new_entry.path = "C"; new_entry.mode = GIT_FILEMODE_BLOB; cl_git_pass(git_index_add_frombuffer(index, &new_entry, "hello!\n", 7)); git_index_free(index); git_buf_dispose(&path); }
void test_index_version__v4_uses_path_compression(void) { git_index_entry entry; git_index *index; char path[250], buf[1]; struct stat st; char i, j; memset(path, 'a', sizeof(path)); memset(buf, 'a', sizeof(buf)); memset(&entry, 0, sizeof(entry)); entry.path = path; entry.mode = GIT_FILEMODE_BLOB; g_repo = cl_git_sandbox_init("indexv4"); cl_git_pass(git_repository_index(&index, g_repo)); /* write 676 paths of 250 bytes length */ for (i = 'a'; i <= 'z'; i++) { for (j = 'a'; j < 'z'; j++) { path[ARRAY_SIZE(path) - 3] = i; path[ARRAY_SIZE(path) - 2] = j; path[ARRAY_SIZE(path) - 1] = '\0'; cl_git_pass(git_index_add_frombuffer(index, &entry, buf, sizeof(buf))); } } cl_git_pass(git_index_write(index)); cl_git_pass(p_stat(git_index_path(index), &st)); /* * Without path compression, the written paths would at * least take * * (entries * pathlen) = len * (676 * 250) = 169000 * * bytes. As index v4 uses suffix-compression and our * written paths only differ in the last two entries, * this number will be much smaller, e.g. * * (1 * pathlen) + (675 * 2) = len * 676 + 1350 = 2026 * * bytes. * * Note that the above calculations do not include * additional metadata of the index, e.g. OIDs or * index extensions. Including those we get an index * of approx. 200kB without compression and 40kB with * compression. As this is a lot smaller than without * compression, we can verify that path compression is * used. */ cl_assert_(st.st_size < 75000, "path compression not enabled"); git_index_free(index); }
void test_index_tests__add_frombuffer(void) { git_index *index; git_repository *repo; git_index_entry entry; const git_index_entry *returned_entry; git_oid id1; git_blob *blob; const char *content = "hey there\n"; cl_set_cleanup(&cleanup_myrepo, NULL); /* Intialize a new repository */ cl_git_pass(git_repository_init(&repo, "./myrepo", 0)); /* Ensure we're the only guy in the room */ cl_git_pass(git_repository_index(&index, repo)); cl_assert(git_index_entrycount(index) == 0); /* Store the expected hash of the file/blob * This has been generated by executing the following * $ echo "hey there" | git hash-object --stdin */ cl_git_pass(git_oid_fromstr(&id1, "a8233120f6ad708f843d861ce2b7228ec4e3dec6")); /* Add the new file to the index */ memset(&entry, 0x0, sizeof(git_index_entry)); entry.mode = GIT_FILEMODE_BLOB; entry.path = "test.txt"; cl_git_pass(git_index_add_frombuffer(index, &entry, content, strlen(content))); /* Wow... it worked! */ cl_assert(git_index_entrycount(index) == 1); returned_entry = git_index_get_byindex(index, 0); /* And the built-in hashing mechanism worked as expected */ cl_assert_equal_oid(&id1, &returned_entry->id); /* And mode is the one asked */ cl_assert_equal_i(GIT_FILEMODE_BLOB, returned_entry->mode); /* Test access by path instead of index */ cl_assert((returned_entry = git_index_get_bypath(index, "test.txt", 0)) != NULL); cl_assert_equal_oid(&id1, &returned_entry->id); /* Test the blob is in the repository */ cl_git_pass(git_blob_lookup(&blob, repo, &id1)); cl_assert_equal_s( content, git_blob_rawcontent(blob)); git_blob_free(blob); git_index_free(index); git_repository_free(repo); }
static void add_entry_and_check_mode_( git_index *index, bool from_file, git_filemode_t mode, const char *file, int line) { size_t pos; const git_index_entry* entry; git_index_entry new_entry; /* If old_filename exists, we copy that to the new file, and test * git_index_add(), otherwise create a new entry testing git_index_add_frombuffer */ if (from_file) { clar__assert(!git_index_find(&pos, index, "exec_off"), file, line, "Cannot find original index entry", NULL, 1); entry = git_index_get_byindex(index, pos); memcpy(&new_entry, entry, sizeof(new_entry)); } else memset(&new_entry, 0x0, sizeof(git_index_entry)); new_entry.path = "filemodes/explicit_test"; new_entry.mode = mode; if (from_file) { clar__assert(!git_index_add(index, &new_entry), file, line, "Cannot add index entry", NULL, 1); } else { const char *content = "hey there\n"; clar__assert(!git_index_add_frombuffer(index, &new_entry, content, strlen(content)), file, line, "Cannot add index entry from buffer", NULL, 1); } clar__assert(!git_index_find(&pos, index, "filemodes/explicit_test"), file, line, "Cannot find new index entry", NULL, 1); entry = git_index_get_byindex(index, pos); clar__assert_equal(file, line, "Expected mode does not match index", 1, "%07o", (unsigned int)entry->mode, (unsigned int)mode); }
void test_index_version__can_write_v4(void) { const char *paths[] = { "foo", "foox", "foobar", "foobal", "x", "xz", "xyzzyx" }; git_index_entry entry; git_index *index; size_t i; g_repo = cl_git_sandbox_init("empty_standard_repo"); cl_git_pass(git_repository_index(&index, g_repo)); cl_git_pass(git_index_set_version(index, 4)); for (i = 0; i < ARRAY_SIZE(paths); i++) { memset(&entry, 0, sizeof(entry)); entry.path = paths[i]; entry.mode = GIT_FILEMODE_BLOB; cl_git_pass(git_index_add_frombuffer(index, &entry, paths[i], strlen(paths[i]) + 1)); } cl_assert_equal_sz(git_index_entrycount(index), ARRAY_SIZE(paths)); cl_git_pass(git_index_write(index)); git_index_free(index); cl_git_pass(git_repository_index(&index, g_repo)); cl_assert(git_index_version(index) == 4); for (i = 0; i < ARRAY_SIZE(paths); i++) { const git_index_entry *e; cl_assert(e = git_index_get_bypath(index, paths[i], 0)); cl_assert_equal_s(paths[i], e->path); } git_index_free(index); }