mirror of
https://git.proxmox.com/git/libgit2
synced 2025-08-07 07:52:30 +00:00
Allow creating copies of git_reference
objects.
This commit is contained in:
parent
1dc449105b
commit
908f24fd13
@ -461,6 +461,17 @@ GIT_EXTERN(int) git_reference_foreach_name(
|
|||||||
git_reference_foreach_name_cb callback,
|
git_reference_foreach_name_cb callback,
|
||||||
void *payload);
|
void *payload);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a copy of an existing reference.
|
||||||
|
*
|
||||||
|
* Call `git_reference_free` to free the data.
|
||||||
|
*
|
||||||
|
* @param dest pointer where to store the copy
|
||||||
|
* @param source object to copy
|
||||||
|
* @return 0 or an error code
|
||||||
|
*/
|
||||||
|
GIT_EXTERN(int) git_reference_dup(git_reference **dest, git_reference *source);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Free the given reference.
|
* Free the given reference.
|
||||||
*
|
*
|
||||||
|
12
src/refs.c
12
src/refs.c
@ -105,6 +105,18 @@ git_reference *git_reference__set_name(
|
|||||||
return rewrite;
|
return rewrite;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int git_reference_dup(git_reference **dest, git_reference *source)
|
||||||
|
{
|
||||||
|
if (source->type == GIT_REF_SYMBOLIC)
|
||||||
|
*dest = git_reference__alloc_symbolic(source->name, source->target.symbolic);
|
||||||
|
else
|
||||||
|
*dest = git_reference__alloc(source->name, &source->target.oid, &source->peel);
|
||||||
|
|
||||||
|
GITERR_CHECK_ALLOC(*dest);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void git_reference_free(git_reference *reference)
|
void git_reference_free(git_reference *reference)
|
||||||
{
|
{
|
||||||
if (reference == NULL)
|
if (reference == NULL)
|
||||||
|
40
tests/refs/dup.c
Normal file
40
tests/refs/dup.c
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#include "clar_libgit2.h"
|
||||||
|
#include "refs.h"
|
||||||
|
|
||||||
|
static git_repository *g_repo;
|
||||||
|
|
||||||
|
void test_refs_dup__initialize(void)
|
||||||
|
{
|
||||||
|
g_repo = cl_git_sandbox_init("testrepo.git");
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_refs_dup__cleanup(void)
|
||||||
|
{
|
||||||
|
cl_git_sandbox_cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_refs_dup__direct(void)
|
||||||
|
{
|
||||||
|
git_reference *a, *b;
|
||||||
|
|
||||||
|
cl_git_pass(git_reference_lookup(&a, g_repo, "refs/heads/master"));
|
||||||
|
cl_git_pass(git_reference_dup(&b, a));
|
||||||
|
|
||||||
|
cl_assert(git_reference_cmp(a, b) == 0);
|
||||||
|
|
||||||
|
git_reference_free(b);
|
||||||
|
git_reference_free(a);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_refs_dup__symbolic(void)
|
||||||
|
{
|
||||||
|
git_reference *a, *b;
|
||||||
|
|
||||||
|
cl_git_pass(git_reference_lookup(&a, g_repo, "HEAD"));
|
||||||
|
cl_git_pass(git_reference_dup(&b, a));
|
||||||
|
|
||||||
|
cl_assert(git_reference_cmp(a, b) == 0);
|
||||||
|
|
||||||
|
git_reference_free(b);
|
||||||
|
git_reference_free(a);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user