mirror of
https://git.proxmox.com/git/libgit2
synced 2025-07-17 21:27:52 +00:00
refdb_fs: do not require peeled packed refs to be tags
Older versions of git would only write peeled entries for items under refs/tags/. Newer versions will write them for all refs, and we should be prepared to handle that.
This commit is contained in:
parent
d966310cab
commit
7edb9071da
@ -132,10 +132,6 @@ static int packed_parse_peel(
|
|||||||
if (tag_ref == NULL)
|
if (tag_ref == NULL)
|
||||||
goto corrupt;
|
goto corrupt;
|
||||||
|
|
||||||
/* Ensure reference is a tag */
|
|
||||||
if (git__prefixcmp(tag_ref->name, GIT_REFS_TAGS_DIR) != 0)
|
|
||||||
goto corrupt;
|
|
||||||
|
|
||||||
if (buffer + GIT_OID_HEXSZ > buffer_end)
|
if (buffer + GIT_OID_HEXSZ > buffer_end)
|
||||||
goto corrupt;
|
goto corrupt;
|
||||||
|
|
||||||
|
@ -1,19 +1,24 @@
|
|||||||
#include "clar_libgit2.h"
|
#include "clar_libgit2.h"
|
||||||
|
|
||||||
static git_repository *g_repo;
|
static git_repository *g_repo;
|
||||||
|
static git_repository *g_peel_repo;
|
||||||
|
|
||||||
void test_refs_peel__initialize(void)
|
void test_refs_peel__initialize(void)
|
||||||
{
|
{
|
||||||
cl_git_pass(git_repository_open(&g_repo, cl_fixture("testrepo.git")));
|
cl_git_pass(git_repository_open(&g_repo, cl_fixture("testrepo.git")));
|
||||||
|
cl_git_pass(git_repository_open(&g_peel_repo, cl_fixture("peeled.git")));
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_refs_peel__cleanup(void)
|
void test_refs_peel__cleanup(void)
|
||||||
{
|
{
|
||||||
git_repository_free(g_repo);
|
git_repository_free(g_repo);
|
||||||
g_repo = NULL;
|
g_repo = NULL;
|
||||||
|
git_repository_free(g_peel_repo);
|
||||||
|
g_peel_repo = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void assert_peel(
|
static void assert_peel_generic(
|
||||||
|
git_repository *repo,
|
||||||
const char *ref_name,
|
const char *ref_name,
|
||||||
git_otype requested_type,
|
git_otype requested_type,
|
||||||
const char* expected_sha,
|
const char* expected_sha,
|
||||||
@ -23,7 +28,7 @@ static void assert_peel(
|
|||||||
git_reference *ref;
|
git_reference *ref;
|
||||||
git_object *peeled;
|
git_object *peeled;
|
||||||
|
|
||||||
cl_git_pass(git_reference_lookup(&ref, g_repo, ref_name));
|
cl_git_pass(git_reference_lookup(&ref, repo, ref_name));
|
||||||
|
|
||||||
cl_git_pass(git_reference_peel(&peeled, ref, requested_type));
|
cl_git_pass(git_reference_peel(&peeled, ref, requested_type));
|
||||||
|
|
||||||
@ -36,6 +41,16 @@ static void assert_peel(
|
|||||||
git_reference_free(ref);
|
git_reference_free(ref);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void assert_peel(
|
||||||
|
const char *ref_name,
|
||||||
|
git_otype requested_type,
|
||||||
|
const char* expected_sha,
|
||||||
|
git_otype expected_type)
|
||||||
|
{
|
||||||
|
assert_peel_generic(g_repo, ref_name, requested_type,
|
||||||
|
expected_sha, expected_type);
|
||||||
|
}
|
||||||
|
|
||||||
static void assert_peel_error(int error, const char *ref_name, git_otype requested_type)
|
static void assert_peel_error(int error, const char *ref_name, git_otype requested_type)
|
||||||
{
|
{
|
||||||
git_reference *ref;
|
git_reference *ref;
|
||||||
@ -90,3 +105,15 @@ void test_refs_peel__can_peel_into_any_non_tag_object(void)
|
|||||||
assert_peel("refs/tags/test", GIT_OBJ_ANY,
|
assert_peel("refs/tags/test", GIT_OBJ_ANY,
|
||||||
"e90810b8df3e80c413d903f631643c716887138d", GIT_OBJ_COMMIT);
|
"e90810b8df3e80c413d903f631643c716887138d", GIT_OBJ_COMMIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_refs_peel__can_peel_fully_peeled_packed_refs(void)
|
||||||
|
{
|
||||||
|
assert_peel_generic(g_peel_repo,
|
||||||
|
"refs/tags/tag-inside-tags", GIT_OBJ_ANY,
|
||||||
|
"0df1a5865c8abfc09f1f2182e6a31be550e99f07",
|
||||||
|
GIT_OBJ_COMMIT);
|
||||||
|
assert_peel_generic(g_peel_repo,
|
||||||
|
"refs/foo/tag-outside-tags", GIT_OBJ_ANY,
|
||||||
|
"0df1a5865c8abfc09f1f2182e6a31be550e99f07",
|
||||||
|
GIT_OBJ_COMMIT);
|
||||||
|
}
|
||||||
|
1
tests-clar/resources/peeled.git/HEAD
Normal file
1
tests-clar/resources/peeled.git/HEAD
Normal file
@ -0,0 +1 @@
|
|||||||
|
ref: refs/heads/master
|
8
tests-clar/resources/peeled.git/config
Normal file
8
tests-clar/resources/peeled.git/config
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
[core]
|
||||||
|
repositoryformatversion = 0
|
||||||
|
filemode = true
|
||||||
|
bare = true
|
||||||
|
[remote "origin"]
|
||||||
|
url = /home/peff/compile/libgit2/tests-clar/resources/peeled
|
||||||
|
fetch = +refs/*:refs/*
|
||||||
|
mirror = true
|
2
tests-clar/resources/peeled.git/objects/info/packs
Normal file
2
tests-clar/resources/peeled.git/objects/info/packs
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
P pack-e84773eaf3fce1774755580e3dbb8d9f3a1adc45.pack
|
||||||
|
|
Binary file not shown.
Binary file not shown.
6
tests-clar/resources/peeled.git/packed-refs
Normal file
6
tests-clar/resources/peeled.git/packed-refs
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
# pack-refs with: peeled fully-peeled
|
||||||
|
c2596aa0151888587ec5c0187f261e63412d9e11 refs/foo/tag-outside-tags
|
||||||
|
^0df1a5865c8abfc09f1f2182e6a31be550e99f07
|
||||||
|
0df1a5865c8abfc09f1f2182e6a31be550e99f07 refs/heads/master
|
||||||
|
c2596aa0151888587ec5c0187f261e63412d9e11 refs/tags/tag-inside-tags
|
||||||
|
^0df1a5865c8abfc09f1f2182e6a31be550e99f07
|
1
tests-clar/resources/peeled.git/refs/heads/master
Normal file
1
tests-clar/resources/peeled.git/refs/heads/master
Normal file
@ -0,0 +1 @@
|
|||||||
|
0df1a5865c8abfc09f1f2182e6a31be550e99f07
|
Loading…
Reference in New Issue
Block a user