Commit d88994da by lhchavez

Create the repository within the test

This change moves the humongous static repository with 1025 commits into
the test file, now with a more modest 16 commits.
parent eab2b044

Too many changes to show.

To preserve performance only 1000 of 1000+ files are displayed.

#include "clar_libgit2.h"
#include "mwindow.h"
#include "global.h"
#include <git2.h>
#include "git2/sys/commit.h"
#include "git2/sys/mempack.h"
static size_t _expected_open_mwindow_files = 0;
static size_t _original_mwindow_file_limit = 0;
extern git_mwindow_ctl git_mwindow__mem_ctl;
size_t mwindow_file_limit = 0;
size_t original_mwindow_file_limit = 0;
void test_pack_filelimit__initialize_tiny(void)
{
mwindow_file_limit = 1;
cl_git_pass(git_libgit2_opts(GIT_OPT_GET_MWINDOW_FILE_LIMIT, &original_mwindow_file_limit));
cl_git_pass(git_libgit2_opts(GIT_OPT_SET_MWINDOW_FILE_LIMIT, mwindow_file_limit));
_expected_open_mwindow_files = 1;
cl_git_pass(git_libgit2_opts(GIT_OPT_GET_MWINDOW_FILE_LIMIT, &_original_mwindow_file_limit));
cl_git_pass(git_libgit2_opts(GIT_OPT_SET_MWINDOW_FILE_LIMIT, _expected_open_mwindow_files));
}
void test_pack_filelimit__initialize_medium(void)
{
mwindow_file_limit = 100;
cl_git_pass(git_libgit2_opts(GIT_OPT_GET_MWINDOW_FILE_LIMIT, &original_mwindow_file_limit));
cl_git_pass(git_libgit2_opts(GIT_OPT_SET_MWINDOW_FILE_LIMIT, mwindow_file_limit));
_expected_open_mwindow_files = 10;
cl_git_pass(git_libgit2_opts(GIT_OPT_GET_MWINDOW_FILE_LIMIT, &_original_mwindow_file_limit));
cl_git_pass(git_libgit2_opts(GIT_OPT_SET_MWINDOW_FILE_LIMIT, _expected_open_mwindow_files));
}
void test_pack_filelimit__initialize_unlimited(void)
{
_expected_open_mwindow_files = 15;
cl_git_pass(git_libgit2_opts(GIT_OPT_GET_MWINDOW_FILE_LIMIT, &_original_mwindow_file_limit));
cl_git_pass(git_libgit2_opts(GIT_OPT_SET_MWINDOW_FILE_LIMIT, 0));
}
void test_pack_filelimit__cleanup(void)
{
cl_git_pass(git_libgit2_opts(GIT_OPT_SET_MWINDOW_FILE_LIMIT, original_mwindow_file_limit));
git_buf path = GIT_BUF_INIT;
cl_git_pass(git_libgit2_opts(GIT_OPT_SET_MWINDOW_FILE_LIMIT, _original_mwindow_file_limit));
cl_git_pass(git_buf_joinpath(&path, clar_sandbox_path(), "repo.git"));
cl_fixture_cleanup(path.ptr);
git_buf_dispose(&path);
}
/*
* Create a packfile with one commit, one tree, and two blobs. The first blob
* (README.md) has the same content in all commits, but the second one
* (file.txt) has a different content in each commit.
*/
void create_packfile_commit(
git_repository *repo,
git_oid *out_commit_id,
git_oid *parent_id,
size_t commit_index,
size_t commit_count)
{
git_buf file_contents = GIT_BUF_INIT;
git_treebuilder *treebuilder;
git_packbuilder *packbuilder;
git_signature *s;
git_oid oid, tree_id, commit_id;
const git_oid *parents[] = { parent_id };
size_t parent_count = parent_id ? 1 : 0;
cl_git_pass(git_treebuilder_new(&treebuilder, repo, NULL));
cl_git_pass(git_blob_create_from_buffer(&oid, repo, "", 0));
cl_git_pass(git_treebuilder_insert(NULL, treebuilder, "README.md", &oid, 0100644));
cl_git_pass(git_buf_printf(&file_contents, "Commit %zd/%zd", commit_index, commit_count));
cl_git_pass(git_blob_create_from_buffer(&oid, repo, file_contents.ptr, file_contents.size));
cl_git_pass(git_treebuilder_insert(NULL, treebuilder, "file.txt", &oid, 0100644));
cl_git_pass(git_treebuilder_write(&tree_id, treebuilder));
cl_git_pass(git_signature_now(&s, "alice", "alice@example.com"));
cl_git_pass(git_commit_create_from_ids(&commit_id, repo, "refs/heads/master", s, s,
NULL, file_contents.ptr, &tree_id, parent_count, parents));
cl_git_pass(git_packbuilder_new(&packbuilder, repo));
cl_git_pass(git_packbuilder_insert_commit(packbuilder, &commit_id));
cl_git_pass(git_packbuilder_write(packbuilder, NULL, 0, NULL, NULL));
cl_git_pass(git_oid_cpy(out_commit_id, &commit_id));
git_buf_dispose(&file_contents);
git_treebuilder_free(treebuilder);
git_packbuilder_free(packbuilder);
git_signature_free(s);
}
void test_pack_filelimit__open_repo_with_1025_packfiles(void)
void test_pack_filelimit__open_repo_with_multiple_packfiles(void)
{
git_buf path = GIT_BUF_INIT;
git_mwindow_ctl *ctl = &git_mwindow__mem_ctl;
git_repository *repo;
git_revwalk *walk;
git_oid id;
int i;
git_oid id, *parent_id = NULL;
size_t i;
const size_t commit_count = 16;
unsigned int open_windows;
/*
* This repository contains 1025 packfiles, each with one commit, one tree,
* and two blobs. The first blob (README.md) has the same content in all
* commits, but the second one (file.txt) has a different content in each
* commit.
* Create a repository and populate it with 16 commits, each in its own
* packfile.
*/
cl_git_pass(git_repository_open(&repo, cl_fixture("1025.git")));
cl_git_pass(git_revwalk_new(&walk, repo));
cl_git_pass(git_buf_joinpath(&path, clar_sandbox_path(), "repo.git"));
cl_git_pass(git_repository_init(&repo, path.ptr, true));
for (i = 1; i <= commit_count; ++i) {
create_packfile_commit(repo, &id, parent_id, i, commit_count);
parent_id = &id;
}
cl_git_pass(git_revwalk_new(&walk, repo));
cl_git_pass(git_revwalk_sorting(walk, GIT_SORT_TOPOLOGICAL));
cl_git_pass(git_revwalk_push_ref(walk, "refs/heads/master"));
/*
* Walking the tree requires opening each of the 1025 packfiles. This should
* work in all platforms, including those where the default limit of open
* file descriptors is small (e.g. 256 in macOS).
* Walking the repository requires eventually opening each of the packfiles.
*/
i = 0;
while (git_revwalk_next(&id, walk) == 0)
++i;
cl_assert_equal_i(1025, i);
cl_assert_equal_i(commit_count, i);
cl_git_pass(git_mutex_lock(&git__mwindow_mutex));
/*
......@@ -65,8 +130,9 @@ void test_pack_filelimit__open_repo_with_1025_packfiles(void)
open_windows = ctl->open_windows;
cl_git_pass(git_mutex_unlock(&git__mwindow_mutex));
cl_assert_equal_i(mwindow_file_limit, open_windows);
cl_assert_equal_i(_expected_open_mwindow_files, open_windows);
git_buf_dispose(&path);
git_revwalk_free(walk);
git_repository_free(repo);
}
[core]
bare = true
repositoryformatversion = 0
filemode = true
Unnamed repository; edit this file 'description' to name the repository.
#!/bin/sh
#
# Place appropriately named executable hook scripts into this directory
# to intercept various actions that git takes. See `git help hooks` for
# more information.
# File patterns to ignore; see `git help ignore` for more information.
# Lines that start with '#' are comments.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment