|
Packit Service |
20376f |
#include "clar_libgit2.h"
|
|
Packit Service |
20376f |
#include "index.h"
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
static git_repository *g_repo = NULL;
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
void test_index_version__cleanup(void)
|
|
Packit Service |
20376f |
{
|
|
Packit Service |
20376f |
cl_git_sandbox_cleanup();
|
|
Packit Service |
20376f |
g_repo = NULL;
|
|
Packit Service |
20376f |
}
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
void test_index_version__can_read_v4(void)
|
|
Packit Service |
20376f |
{
|
|
Packit Service |
20376f |
const char *paths[] = {
|
|
Packit Service |
20376f |
"file.tx", "file.txt", "file.txz", "foo", "zzz",
|
|
Packit Service |
20376f |
};
|
|
Packit Service |
20376f |
git_index *index;
|
|
Packit Service |
20376f |
size_t i;
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
g_repo = cl_git_sandbox_init("indexv4");
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
cl_git_pass(git_repository_index(&index, g_repo));
|
|
Packit Service |
20376f |
cl_assert_equal_sz(git_index_entrycount(index), 5);
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
for (i = 0; i < ARRAY_SIZE(paths); i++) {
|
|
Packit Service |
20376f |
const git_index_entry *entry =
|
|
Packit Service |
20376f |
git_index_get_bypath(index, paths[i], GIT_INDEX_STAGE_NORMAL);
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
cl_assert(entry != NULL);
|
|
Packit Service |
20376f |
}
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
git_index_free(index);
|
|
Packit Service |
20376f |
}
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
void test_index_version__can_write_v4(void)
|
|
Packit Service |
20376f |
{
|
|
Packit Service |
20376f |
const char *paths[] = {
|
|
Packit Service |
20376f |
"foo",
|
|
Packit Service |
20376f |
"foox",
|
|
Packit Service |
20376f |
"foobar",
|
|
Packit Service |
20376f |
"foobal",
|
|
Packit Service |
20376f |
"x",
|
|
Packit Service |
20376f |
"xz",
|
|
Packit Service |
20376f |
"xyzzyx"
|
|
Packit Service |
20376f |
};
|
|
Packit Service |
20376f |
git_index_entry entry;
|
|
Packit Service |
20376f |
git_index *index;
|
|
Packit Service |
20376f |
size_t i;
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
g_repo = cl_git_sandbox_init("empty_standard_repo");
|
|
Packit Service |
20376f |
cl_git_pass(git_repository_index(&index, g_repo));
|
|
Packit Service |
20376f |
cl_git_pass(git_index_set_version(index, 4));
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
for (i = 0; i < ARRAY_SIZE(paths); i++) {
|
|
Packit Service |
20376f |
memset(&entry, 0, sizeof(entry));
|
|
Packit Service |
20376f |
entry.path = paths[i];
|
|
Packit Service |
20376f |
entry.mode = GIT_FILEMODE_BLOB;
|
|
Packit Service |
20376f |
cl_git_pass(git_index_add_frombuffer(index, &entry, paths[i],
|
|
Packit Service |
20376f |
strlen(paths[i]) + 1));
|
|
Packit Service |
20376f |
}
|
|
Packit Service |
20376f |
cl_assert_equal_sz(git_index_entrycount(index), ARRAY_SIZE(paths));
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
cl_git_pass(git_index_write(index));
|
|
Packit Service |
20376f |
git_index_free(index);
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
cl_git_pass(git_repository_index(&index, g_repo));
|
|
Packit Service |
20376f |
cl_assert(git_index_version(index) == 4);
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
for (i = 0; i < ARRAY_SIZE(paths); i++) {
|
|
Packit Service |
20376f |
const git_index_entry *e;
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
cl_assert(e = git_index_get_bypath(index, paths[i], 0));
|
|
Packit Service |
20376f |
cl_assert_equal_s(paths[i], e->path);
|
|
Packit Service |
20376f |
}
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
git_index_free(index);
|
|
Packit Service |
20376f |
}
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
void test_index_version__v4_uses_path_compression(void)
|
|
Packit Service |
20376f |
{
|
|
Packit Service |
20376f |
git_index_entry entry;
|
|
Packit Service |
20376f |
git_index *index;
|
|
Packit Service |
20376f |
char path[250], buf[1];
|
|
Packit Service |
20376f |
struct stat st;
|
|
Packit Service |
20376f |
char i, j;
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
memset(path, 'a', sizeof(path));
|
|
Packit Service |
20376f |
memset(buf, 'a', sizeof(buf));
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
memset(&entry, 0, sizeof(entry));
|
|
Packit Service |
20376f |
entry.path = path;
|
|
Packit Service |
20376f |
entry.mode = GIT_FILEMODE_BLOB;
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
g_repo = cl_git_sandbox_init("indexv4");
|
|
Packit Service |
20376f |
cl_git_pass(git_repository_index(&index, g_repo));
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
/* write 676 paths of 250 bytes length */
|
|
Packit Service |
20376f |
for (i = 'a'; i <= 'z'; i++) {
|
|
Packit Service |
20376f |
for (j = 'a'; j < 'z'; j++) {
|
|
Packit Service |
20376f |
path[ARRAY_SIZE(path) - 3] = i;
|
|
Packit Service |
20376f |
path[ARRAY_SIZE(path) - 2] = j;
|
|
Packit Service |
20376f |
path[ARRAY_SIZE(path) - 1] = '\0';
|
|
Packit Service |
20376f |
cl_git_pass(git_index_add_frombuffer(index, &entry, buf, sizeof(buf)));
|
|
Packit Service |
20376f |
}
|
|
Packit Service |
20376f |
}
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
cl_git_pass(git_index_write(index));
|
|
Packit Service |
20376f |
cl_git_pass(p_stat(git_index_path(index), &st);;
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
/*
|
|
Packit Service |
20376f |
* Without path compression, the written paths would at
|
|
Packit Service |
20376f |
* least take
|
|
Packit Service |
20376f |
*
|
|
Packit Service |
20376f |
* (entries * pathlen) = len
|
|
Packit Service |
20376f |
* (676 * 250) = 169000
|
|
Packit Service |
20376f |
*
|
|
Packit Service |
20376f |
* bytes. As index v4 uses suffix-compression and our
|
|
Packit Service |
20376f |
* written paths only differ in the last two entries,
|
|
Packit Service |
20376f |
* this number will be much smaller, e.g.
|
|
Packit Service |
20376f |
*
|
|
Packit Service |
20376f |
* (1 * pathlen) + (675 * 2) = len
|
|
Packit Service |
20376f |
* 676 + 1350 = 2026
|
|
Packit Service |
20376f |
*
|
|
Packit Service |
20376f |
* bytes.
|
|
Packit Service |
20376f |
*
|
|
Packit Service |
20376f |
* Note that the above calculations do not include
|
|
Packit Service |
20376f |
* additional metadata of the index, e.g. OIDs or
|
|
Packit Service |
20376f |
* index extensions. Including those we get an index
|
|
Packit Service |
20376f |
* of approx. 200kB without compression and 40kB with
|
|
Packit Service |
20376f |
* compression. As this is a lot smaller than without
|
|
Packit Service |
20376f |
* compression, we can verify that path compression is
|
|
Packit Service |
20376f |
* used.
|
|
Packit Service |
20376f |
*/
|
|
Packit Service |
20376f |
cl_assert_(st.st_size < 75000, "path compression not enabled");
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
git_index_free(index);
|
|
Packit Service |
20376f |
}
|