mirror of
https://github.com/libgit2/libgit2.git
synced 2026-06-22 06:26:26 +00:00
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.
This commit is contained in:
@@ -1,61 +1,126 @@
|
||||
#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);
|
||||
}
|
||||
|
||||
void test_pack_filelimit__open_repo_with_1025_packfiles(void)
|
||||
/*
|
||||
* 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_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);
|
||||
}
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
ref: refs/heads/master
|
||||
@@ -1,4 +0,0 @@
|
||||
[core]
|
||||
bare = true
|
||||
repositoryformatversion = 0
|
||||
filemode = true
|
||||
@@ -1 +0,0 @@
|
||||
Unnamed repository; edit this file 'description' to name the repository.
|
||||
@@ -1,5 +0,0 @@
|
||||
#!/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.
|
||||
@@ -1,2 +0,0 @@
|
||||
# File patterns to ignore; see `git help ignore` for more information.
|
||||
# Lines that start with '#' are comments.
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user