mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-28 02:16:21 +00:00

We had some home-grown logic to figure out which objects to show during the revision walk, but it was rather inefficient, looking over the same list multiple times to figure out when we had run out of interesting commits. We now use the lists in a smarter way. We also introduce the slop mechanism to determine when to stpo looking. When we run out of interesting objects, we continue preparing the walk for another 5 rounds in order to make it less likely that we miss objects in situations with complex graphs.
204 lines
4.7 KiB
C
204 lines
4.7 KiB
C
#include "clar_libgit2.h"
|
|
/*
|
|
* a4a7dce [0] Merge branch 'master' into br2
|
|
|\
|
|
| * 9fd738e [1] a fourth commit
|
|
| * 4a202b3 [2] a third commit
|
|
* | c47800c [3] branch commit one
|
|
|/
|
|
* 5b5b025 [5] another commit
|
|
* 8496071 [4] testing
|
|
*/
|
|
static const char *commit_head = "a4a7dce85cf63874e984719f4fdd239f5145052f";
|
|
|
|
static const char *commit_strs[] = {
|
|
"a4a7dce85cf63874e984719f4fdd239f5145052f", /* 0 */
|
|
"9fd738e8f7967c078dceed8190330fc8648ee56a", /* 1 */
|
|
"4a202b346bb0fb0db7eff3cffeb3c70babbd2045", /* 2 */
|
|
"c47800c7266a2be04c571c04d5a6614691ea99bd", /* 3 */
|
|
"8496071c1b46c854b31185ea97743be6a8774479", /* 4 */
|
|
"5b5b025afb0b4c913b4c338a42934a3863bf3644", /* 5 */
|
|
};
|
|
|
|
#define commit_count 6
|
|
|
|
static git_oid commit_ids[commit_count];
|
|
static git_oid _head_id;
|
|
static git_repository *_repo;
|
|
|
|
|
|
void test_revwalk_hidecb__initialize(void)
|
|
{
|
|
int i;
|
|
|
|
cl_git_pass(git_repository_open(&_repo, cl_fixture("testrepo.git")));
|
|
cl_git_pass(git_oid_fromstr(&_head_id, commit_head));
|
|
|
|
for (i = 0; i < commit_count; i++)
|
|
cl_git_pass(git_oid_fromstr(&commit_ids[i], commit_strs[i]));
|
|
|
|
}
|
|
|
|
void test_revwalk_hidecb__cleanup(void)
|
|
{
|
|
git_repository_free(_repo);
|
|
_repo = NULL;
|
|
}
|
|
|
|
/* Hide all commits */
|
|
static int hide_every_commit_cb(const git_oid *commit_id, void *data)
|
|
{
|
|
GIT_UNUSED(commit_id);
|
|
GIT_UNUSED(data);
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* Do not hide anything */
|
|
static int hide_none_cb(const git_oid *commit_id, void *data)
|
|
{
|
|
GIT_UNUSED(commit_id);
|
|
GIT_UNUSED(data);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* Hide some commits */
|
|
static int hide_commit_cb(const git_oid *commit_id, void *data)
|
|
{
|
|
GIT_UNUSED(commit_id);
|
|
GIT_UNUSED(data);
|
|
|
|
return (git_oid_cmp(commit_id, &commit_ids[5]) == 0);
|
|
}
|
|
|
|
/* In payload data, pointer to a commit id is passed */
|
|
static int hide_commit_use_payload_cb(const git_oid *commit_id, void *data)
|
|
{
|
|
git_oid *hide_commit_id = data;
|
|
|
|
return (git_oid_cmp(commit_id, hide_commit_id) == 0);
|
|
}
|
|
|
|
void test_revwalk_hidecb__hide_all_cb(void)
|
|
{
|
|
git_revwalk *walk;
|
|
git_oid id;
|
|
|
|
cl_git_pass(git_revwalk_new(&walk, _repo));
|
|
cl_git_pass(git_revwalk_add_hide_cb(walk, hide_every_commit_cb, NULL));
|
|
cl_git_pass(git_revwalk_push(walk, &_head_id));
|
|
|
|
/* First call to git_revwalk_next should return GIT_ITEROVER */
|
|
cl_assert_equal_i(GIT_ITEROVER, git_revwalk_next(&id, walk));
|
|
|
|
git_revwalk_free(walk);
|
|
}
|
|
|
|
|
|
void test_revwalk_hidecb__hide_none_cb(void)
|
|
{
|
|
git_revwalk *walk;
|
|
int i, error;
|
|
git_oid id;
|
|
|
|
cl_git_pass(git_revwalk_new(&walk, _repo));
|
|
cl_git_pass(git_revwalk_add_hide_cb(walk, hide_none_cb, NULL));
|
|
cl_git_pass(git_revwalk_push(walk, &_head_id));
|
|
|
|
/* It should return all 6 commits */
|
|
i = 0;
|
|
while ((error = git_revwalk_next(&id, walk)) == 0)
|
|
i++;
|
|
|
|
cl_assert_equal_i(i, 6);
|
|
cl_assert_equal_i(error, GIT_ITEROVER);
|
|
|
|
git_revwalk_free(walk);
|
|
}
|
|
|
|
void test_revwalk_hidecb__add_hide_cb_multiple_times(void)
|
|
{
|
|
git_revwalk *walk;
|
|
|
|
cl_git_pass(git_revwalk_new(&walk, _repo));
|
|
cl_git_pass(git_revwalk_add_hide_cb(walk, hide_every_commit_cb, NULL));
|
|
cl_git_fail(git_revwalk_add_hide_cb(walk, hide_every_commit_cb, NULL));
|
|
|
|
git_revwalk_free(walk);
|
|
}
|
|
|
|
void test_revwalk_hidecb__add_hide_cb_during_walking(void)
|
|
{
|
|
git_revwalk *walk;
|
|
git_oid id;
|
|
int error;
|
|
|
|
cl_git_pass(git_revwalk_new(&walk, _repo));
|
|
cl_git_pass(git_revwalk_push(walk, &_head_id));
|
|
|
|
/* Start walking without adding hide callback */
|
|
cl_git_pass(git_revwalk_next(&id, walk));
|
|
|
|
/* Now add hide callback */
|
|
cl_git_pass(git_revwalk_add_hide_cb(walk, hide_none_cb, NULL));
|
|
|
|
/* walk should be reset */
|
|
error = git_revwalk_next(&id, walk);
|
|
cl_assert_equal_i(error, GIT_ITEROVER);
|
|
|
|
git_revwalk_free(walk);
|
|
}
|
|
|
|
void test_revwalk_hidecb__hide_some_commits(void)
|
|
{
|
|
git_revwalk *walk;
|
|
git_oid id;
|
|
int i, error;
|
|
|
|
cl_git_pass(git_revwalk_new(&walk, _repo));
|
|
cl_git_pass(git_revwalk_push(walk, &_head_id));
|
|
git_revwalk_sorting(walk, GIT_SORT_TOPOLOGICAL | GIT_SORT_TIME);
|
|
|
|
/* Add hide callback */
|
|
cl_git_pass(git_revwalk_add_hide_cb(walk, hide_commit_cb, NULL));
|
|
|
|
i = 0;
|
|
while ((error = git_revwalk_next(&id, walk)) == 0) {
|
|
cl_assert_equal_oid(&commit_ids[i], &id);
|
|
i++;
|
|
}
|
|
|
|
cl_assert_equal_i(i, 4);
|
|
cl_assert_equal_i(error, GIT_ITEROVER);
|
|
|
|
git_revwalk_free(walk);
|
|
}
|
|
|
|
void test_revwalk_hidecb__test_payload(void)
|
|
{
|
|
git_revwalk *walk;
|
|
git_oid id;
|
|
int i, error;
|
|
|
|
cl_git_pass(git_revwalk_new(&walk, _repo));
|
|
cl_git_pass(git_revwalk_push(walk, &_head_id));
|
|
git_revwalk_sorting(walk, GIT_SORT_TOPOLOGICAL | GIT_SORT_TIME);
|
|
|
|
/* Add hide callback, pass id of parent of initial commit as payload data */
|
|
cl_git_pass(git_revwalk_add_hide_cb(walk, hide_commit_use_payload_cb, &commit_ids[5]));
|
|
|
|
i = 0;
|
|
while ((error = git_revwalk_next(&id, walk)) == 0) {
|
|
cl_assert_equal_oid(&commit_ids[i], &id);
|
|
i++;
|
|
}
|
|
|
|
/* walker should return four commits */
|
|
cl_assert_equal_i(i, 4);
|
|
cl_assert_equal_i(error, GIT_ITEROVER);
|
|
|
|
git_revwalk_free(walk);
|
|
}
|
|
|