From 5367ec4b84dc3b4ff3ff441347ce07d6065dd759 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Wed, 5 Feb 2014 12:02:52 +0100 Subject: refs: add an unconditional delete Add it under the git_reference_remove() name, letting the user pass the repo and name, analogous to unconditional setting/creation. --- include/git2/refs.h | 11 +++++++++++ src/refs.c | 11 +++++++++++ tests/refs/delete.c | 14 ++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/include/git2/refs.h b/include/git2/refs.h index 0e5f779cf..970faf744 100644 --- a/include/git2/refs.h +++ b/include/git2/refs.h @@ -406,6 +406,17 @@ GIT_EXTERN(int) git_reference_rename( */ GIT_EXTERN(int) git_reference_delete(git_reference *ref); +/** + * Delete an existing reference by name + * + * This method removes the named reference from the repository without + * looking at its old value. + * + * @param ref The reference to remove + * @return 0, GIT_EMODIFIED or an error code + */ +GIT_EXTERN(int) git_reference_remove(git_repository *repo, const char *name); + /** * Fill a list with all the references that can be found in a repository. * diff --git a/src/refs.c b/src/refs.c index 90340d09c..bdf2da37e 100644 --- a/src/refs.c +++ b/src/refs.c @@ -127,6 +127,17 @@ int git_reference_delete(git_reference *ref) return git_refdb_delete(ref->db, ref->name, old_id, old_target); } +int git_reference_remove(git_repository *repo, const char *name) +{ + git_refdb *db; + int error; + + if ((error = git_repository_refdb__weakptr(&db, repo)) < 0) + return error; + + return git_refdb_delete(db, name, NULL, NULL); +} + int git_reference_lookup(git_reference **ref_out, git_repository *repo, const char *name) { diff --git a/tests/refs/delete.c b/tests/refs/delete.c index 5e4afb138..9d1c3fd79 100644 --- a/tests/refs/delete.c +++ b/tests/refs/delete.c @@ -91,3 +91,17 @@ void test_refs_delete__packed_only(void) git_reference_free(ref); git_refdb_free(refdb); } + +void test_refs_delete__remove(void) +{ + git_reference *ref; + + /* Check that passing no old values lets us delete */ + + cl_git_pass(git_reference_lookup(&ref, g_repo, packed_test_head_name)); + git_reference_free(ref); + + cl_git_pass(git_reference_remove(g_repo, packed_test_head_name)); + + cl_git_fail(git_reference_lookup(&ref, g_repo, packed_test_head_name)); +} -- cgit v1.2.1