tests/libgit2: don't access refs via filesystem

There are a bunch of tests where we read or write references via the
filesystem directly. This only works with the "files" backend, but
naturally breaks if we supported any other reference format.

Refactor these tests to instead use the refdb to access those.
This commit is contained in:
Patrick Steinhardt
2026-03-30 07:54:09 +02:00
parent 5e058b54ee
commit 5c5db73e3e
6 changed files with 46 additions and 62 deletions

View File

@@ -63,6 +63,7 @@ void test_cherrypick_workdir__automerge(void)
git_commit *head = NULL, *commit = NULL;
git_oid cherry_oid, cherrypicked_oid, cherrypicked_tree_oid;
git_tree *cherrypicked_tree = NULL;
git_reference *ref;
cl_git_pass(git_commit_lookup(&head, repo, &head_oid));
cl_git_pass(git_reset(repo, (git_object *)head, GIT_RESET_HARD, NULL));
@@ -71,7 +72,7 @@ void test_cherrypick_workdir__automerge(void)
cl_git_pass(git_commit_lookup(&commit, repo, &cherry_oid));
cl_git_pass(git_cherrypick(repo, commit, NULL));
cl_assert(git_fs_path_exists(TEST_REPO_PATH "/.git/CHERRY_PICK_HEAD"));
cl_git_pass(git_reference_lookup(&ref, repo, "CHERRY_PICK_HEAD"));
cl_assert(git_fs_path_exists(TEST_REPO_PATH "/.git/MERGE_MSG"));
cl_git_pass(git_index_write_tree(&cherrypicked_tree_oid, repo_index));
@@ -84,6 +85,7 @@ void test_cherrypick_workdir__automerge(void)
git_oid_cpy(&head_oid, &cherrypicked_oid);
git_tree_free(cherrypicked_tree);
git_reference_free(ref);
git_commit_free(head);
git_commit_free(commit);
}
@@ -140,6 +142,7 @@ void test_cherrypick_workdir__conflicts(void)
git_commit *head = NULL, *commit = NULL;
git_oid head_oid, cherry_oid;
git_str conflicting_buf = GIT_STR_INIT, mergemsg_buf = GIT_STR_INIT;
git_reference *ref;
struct merge_index_entry merge_index_entries[] = {
{ 0100644, "242e7977ba73637822ffb265b46004b9b0e5153b", 0, "file1.txt" },
@@ -160,7 +163,7 @@ void test_cherrypick_workdir__conflicts(void)
cl_git_pass(git_commit_lookup(&commit, repo, &cherry_oid));
cl_git_pass(git_cherrypick(repo, commit, NULL));
cl_assert(git_fs_path_exists(TEST_REPO_PATH "/.git/CHERRY_PICK_HEAD"));
cl_git_pass(git_reference_lookup(&ref, repo, "CHERRY_PICK_HEAD"));
cl_assert(git_fs_path_exists(TEST_REPO_PATH "/.git/MERGE_MSG"));
cl_assert(merge_test_index(repo_index, merge_index_entries, 7));
@@ -225,6 +228,7 @@ void test_cherrypick_workdir__conflicts(void)
"File 3!\n" \
">>>>>>> e9b63f3... Change all files\n") == 0);
git_reference_free(ref);
git_commit_free(commit);
git_commit_free(head);
git_str_dispose(&mergemsg_buf);

View File

@@ -120,15 +120,11 @@ void test_merge_analysis__unborn(void)
{
git_merge_analysis_t merge_analysis;
git_merge_preference_t merge_pref;
git_str master = GIT_STR_INIT;
cl_git_pass(git_str_joinpath(&master, git_repository_path(repo), "refs/heads/master"));
cl_must_pass(p_unlink(git_str_cstr(&master)));
cl_git_pass(git_reference_remove(repo, "refs/heads/master"));
analysis_from_branch(&merge_analysis, &merge_pref, NULL, NOFASTFORWARD_BRANCH);
cl_assert_equal_i(GIT_MERGE_ANALYSIS_FASTFORWARD|GIT_MERGE_ANALYSIS_UNBORN, merge_analysis);
git_str_dispose(&master);
}
void test_merge_analysis__fastforward_with_config_noff(void)

View File

@@ -471,45 +471,15 @@ void test_merge_workdir_setup__three_same_oids(void)
static int create_remote_tracking_branch(const char *branch_name, const char *oid_str)
{
int error = 0;
git_str refname = GIT_STR_INIT;
git_oid oid;
git_str remotes_path = GIT_STR_INIT,
origin_path = GIT_STR_INIT,
filename = GIT_STR_INIT,
data = GIT_STR_INIT;
cl_git_pass(git_oid_from_string(&oid, oid_str, GIT_OID_SHA1));
cl_git_pass(git_str_printf(&refname, GIT_REFS_REMOTES_DIR "origin/%s", branch_name));
cl_git_pass(git_reference_create(NULL, repo, refname.ptr, &oid, 0, NULL));
if ((error = git_str_puts(&remotes_path, git_repository_path(repo))) < 0 ||
(error = git_str_puts(&remotes_path, GIT_REFS_REMOTES_DIR)) < 0)
goto done;
if (!git_fs_path_exists(git_str_cstr(&remotes_path)) &&
(error = p_mkdir(git_str_cstr(&remotes_path), 0777)) < 0)
goto done;
if ((error = git_str_puts(&origin_path, git_str_cstr(&remotes_path))) < 0 ||
(error = git_str_puts(&origin_path, "origin")) < 0)
goto done;
if (!git_fs_path_exists(git_str_cstr(&origin_path)) &&
(error = p_mkdir(git_str_cstr(&origin_path), 0777)) < 0)
goto done;
if ((error = git_str_puts(&filename, git_str_cstr(&origin_path))) < 0 ||
(error = git_str_puts(&filename, "/")) < 0 ||
(error = git_str_puts(&filename, branch_name)) < 0 ||
(error = git_str_puts(&data, oid_str)) < 0 ||
(error = git_str_puts(&data, "\n")) < 0)
goto done;
cl_git_rewritefile(git_str_cstr(&filename), git_str_cstr(&data));
done:
git_str_dispose(&remotes_path);
git_str_dispose(&origin_path);
git_str_dispose(&filename);
git_str_dispose(&data);
return error;
git_str_dispose(&refname);
return 0;
}
/* git merge refs/remotes/origin/octo1 */

View File

@@ -23,6 +23,18 @@ void test_rebase_setup__cleanup(void)
cl_git_sandbox_cleanup();
}
static void cl_assert_equal_ref(const char *oid_str, const char *refname)
{
git_reference *ref;
git_oid oid;
cl_git_pass(git_oid_from_string(&oid, oid_str, GIT_OID_SHA1));
cl_git_pass(git_reference_lookup(&ref, repo, refname));
cl_assert_equal_oid(&oid, git_reference_target(ref));
git_reference_free(ref);
}
/* git checkout beef ; git rebase --merge master
* git checkout beef ; git rebase --merge master */
void test_rebase_setup__blocked_when_in_progress(void)
@@ -79,7 +91,7 @@ void test_rebase_setup__merge(void)
cl_git_pass(git_reference_peel((git_object **)&head_commit, head, GIT_OBJECT_COMMIT));
cl_assert_equal_oid(&head_id, git_commit_id(head_commit));
cl_assert_equal_file("b146bd7608eac53d9bf9e1a6963543588b555c64\n", 41, "rebase/.git/ORIG_HEAD");
cl_assert_equal_ref("b146bd7608eac53d9bf9e1a6963543588b555c64", "ORIG_HEAD");
cl_assert_equal_file("da9c51a23d02d931a486f45ad18cda05cf5d2b94\n", 41, "rebase/.git/rebase-merge/cmt.1");
cl_assert_equal_file("8d1f13f93c4995760ac07d129246ac1ff64c0be9\n", 41, "rebase/.git/rebase-merge/cmt.2");
@@ -125,7 +137,7 @@ void test_rebase_setup__merge_root(void)
cl_git_pass(git_reference_peel((git_object **)&head_commit, head, GIT_OBJECT_COMMIT));
cl_assert_equal_oid(&head_id, git_commit_id(head_commit));
cl_assert_equal_file("b146bd7608eac53d9bf9e1a6963543588b555c64\n", 41, "rebase/.git/ORIG_HEAD");
cl_assert_equal_ref("b146bd7608eac53d9bf9e1a6963543588b555c64", "ORIG_HEAD");
cl_assert_equal_i(GIT_REPOSITORY_STATE_REBASE_MERGE, git_repository_state(repo));
@@ -175,7 +187,7 @@ void test_rebase_setup__merge_onto_and_upstream(void)
cl_git_pass(git_reference_peel((git_object **)&head_commit, head, GIT_OBJECT_COMMIT));
cl_assert_equal_oid(&head_id, git_commit_id(head_commit));
cl_assert_equal_file("d616d97082eb7bb2dc6f180a7cca940993b7a56f\n", 41, "rebase/.git/ORIG_HEAD");
cl_assert_equal_ref("d616d97082eb7bb2dc6f180a7cca940993b7a56f", "ORIG_HEAD");
cl_assert_equal_i(GIT_REPOSITORY_STATE_REBASE_MERGE, git_repository_state(repo));
@@ -229,7 +241,7 @@ void test_rebase_setup__merge_onto_upstream_and_branch(void)
cl_git_pass(git_reference_peel((git_object **)&head_commit, head, GIT_OBJECT_COMMIT));
cl_assert_equal_oid(&head_id, git_commit_id(head_commit));
cl_assert_equal_file("f87d14a4a236582a0278a916340a793714256864\n", 41, "rebase/.git/ORIG_HEAD");
cl_assert_equal_ref("f87d14a4a236582a0278a916340a793714256864", "ORIG_HEAD");
cl_assert_equal_i(GIT_REPOSITORY_STATE_REBASE_MERGE, git_repository_state(repo));
@@ -287,7 +299,7 @@ void test_rebase_setup__merge_onto_upstream_and_branch_by_id(void)
cl_git_pass(git_reference_peel((git_object **)&head_commit, head, GIT_OBJECT_COMMIT));
cl_assert_equal_oid(&head_id, git_commit_id(head_commit));
cl_assert_equal_file("d616d97082eb7bb2dc6f180a7cca940993b7a56f\n", 41, "rebase/.git/ORIG_HEAD");
cl_assert_equal_ref("d616d97082eb7bb2dc6f180a7cca940993b7a56f", "ORIG_HEAD");
cl_assert_equal_i(GIT_REPOSITORY_STATE_REBASE_MERGE, git_repository_state(repo));
@@ -333,7 +345,7 @@ void test_rebase_setup__branch_with_merges(void)
cl_git_pass(git_reference_peel((git_object **)&head_commit, head, GIT_OBJECT_COMMIT));
cl_assert_equal_oid(&head_id, git_commit_id(head_commit));
cl_assert_equal_file("f87d14a4a236582a0278a916340a793714256864\n", 41, "rebase/.git/ORIG_HEAD");
cl_assert_equal_ref("f87d14a4a236582a0278a916340a793714256864", "ORIG_HEAD");
cl_assert_equal_file("4bed71df7017283cac61bbf726197ad6a5a18b84\n", 41, "rebase/.git/rebase-merge/cmt.1");
cl_assert_equal_file("2aa3ce842094e08ebac152b3d6d5b0fff39f9c6e\n", 41, "rebase/.git/rebase-merge/cmt.2");
@@ -381,7 +393,7 @@ void test_rebase_setup__orphan_branch(void)
cl_git_pass(git_reference_peel((git_object **)&head_commit, head, GIT_OBJECT_COMMIT));
cl_assert_equal_oid(&head_id, git_commit_id(head_commit));
cl_assert_equal_file("12c084412b952396962eb420716df01022b847cc\n", 41, "rebase/.git/ORIG_HEAD");
cl_assert_equal_ref("12c084412b952396962eb420716df01022b847cc", "ORIG_HEAD");
cl_assert_equal_file("aa4c42aecdfc7cd989bbc3209934ea7cda3f4d88\n", 41, "rebase/.git/rebase-merge/cmt.1");
cl_assert_equal_file("e4f809f826c1a9fc929874bc0e4644dd2f2a1af4\n", 41, "rebase/.git/rebase-merge/cmt.2");
@@ -432,7 +444,7 @@ void test_rebase_setup__merge_null_branch_uses_HEAD(void)
cl_git_pass(git_reference_peel((git_object **)&head_commit, head, GIT_OBJECT_COMMIT));
cl_assert_equal_oid(&head_id, git_commit_id(head_commit));
cl_assert_equal_file("b146bd7608eac53d9bf9e1a6963543588b555c64\n", 41, "rebase/.git/ORIG_HEAD");
cl_assert_equal_ref("b146bd7608eac53d9bf9e1a6963543588b555c64", "ORIG_HEAD");
cl_assert_equal_file("da9c51a23d02d931a486f45ad18cda05cf5d2b94\n", 41, "rebase/.git/rebase-merge/cmt.1");
cl_assert_equal_file("8d1f13f93c4995760ac07d129246ac1ff64c0be9\n", 41, "rebase/.git/rebase-merge/cmt.2");
@@ -479,7 +491,7 @@ void test_rebase_setup__merge_from_detached(void)
cl_git_pass(git_reference_peel((git_object **)&head_commit, head, GIT_OBJECT_COMMIT));
cl_assert_equal_oid(&head_id, git_commit_id(head_commit));
cl_assert_equal_file("b146bd7608eac53d9bf9e1a6963543588b555c64\n", 41, "rebase/.git/ORIG_HEAD");
cl_assert_equal_ref("b146bd7608eac53d9bf9e1a6963543588b555c64", "ORIG_HEAD");
cl_assert_equal_file("da9c51a23d02d931a486f45ad18cda05cf5d2b94\n", 41, "rebase/.git/rebase-merge/cmt.1");
cl_assert_equal_file("8d1f13f93c4995760ac07d129246ac1ff64c0be9\n", 41, "rebase/.git/rebase-merge/cmt.2");
@@ -527,7 +539,7 @@ void test_rebase_setup__merge_branch_by_id(void)
cl_git_pass(git_reference_peel((git_object **)&head_commit, head, GIT_OBJECT_COMMIT));
cl_assert_equal_oid(&head_id, git_commit_id(head_commit));
cl_assert_equal_file("b146bd7608eac53d9bf9e1a6963543588b555c64\n", 41, "rebase/.git/ORIG_HEAD");
cl_assert_equal_ref("b146bd7608eac53d9bf9e1a6963543588b555c64", "ORIG_HEAD");
cl_assert_equal_file("da9c51a23d02d931a486f45ad18cda05cf5d2b94\n", 41, "rebase/.git/rebase-merge/cmt.1");
cl_assert_equal_file("8d1f13f93c4995760ac07d129246ac1ff64c0be9\n", 41, "rebase/.git/rebase-merge/cmt.2");

View File

@@ -1,6 +1,8 @@
#include "clar_libgit2.h"
#include "refs.h"
#include "repo_helpers.h"
#include "repository.h"
#include "refdb.h"
#include "posix.h"
void make_head_unborn(git_repository* repo, const char *target)
@@ -13,12 +15,9 @@ void make_head_unborn(git_repository* repo, const char *target)
void delete_head(git_repository* repo)
{
git_str head_path = GIT_STR_INIT;
cl_git_pass(git_str_joinpath(&head_path, git_repository_path(repo), GIT_HEAD_REF));
cl_git_pass(p_unlink(git_str_cstr(&head_path)));
git_str_dispose(&head_path);
git_refdb *refdb;
cl_git_pass(git_repository_refdb__weakptr(&refdb, repo));
cl_git_pass(git_refdb_delete(refdb, GIT_HEAD_REF, NULL, NULL));
}
void create_tmp_global_config(const char *dirname, const char *key, const char *val)

View File

@@ -182,12 +182,13 @@ void test_revwalk_basic__glob_heads_with_invalid(void)
void test_revwalk_basic__glob_invalid_symbolic_ref(void)
{
git_reference *ref;
int i;
git_oid oid;
revwalk_basic_setup_walk("testrepo");
cl_git_mkfile("testrepo/.git/refs/heads/broken-sym-ref", "ref: refs/heads/does-not-exist");
cl_git_pass(git_reference_symbolic_create(&ref, _repo, "refs/heads/broken-sym-ref",
"refs/heads/does-not-exist", 1, NULL));
cl_git_pass(git_revwalk_push_glob(_walk, "heads"));
for (i = 0; !git_revwalk_next(&oid, _walk); ++i)
@@ -195,6 +196,8 @@ void test_revwalk_basic__glob_invalid_symbolic_ref(void)
/* git log --branches --oneline | wc -l => 16 */
cl_assert_equal_i(20, i);
git_reference_free(ref);
}
void test_revwalk_basic__push_head(void)