diff options
author | Vicent Marti <tanoku@gmail.com> | 2012-08-23 15:47:29 -0700 |
---|---|---|
committer | Vicent Marti <tanoku@gmail.com> | 2012-08-26 18:00:10 -0700 |
commit | 1c947daa80dfa442acbf8119530a3dcbf5af00c5 (patch) | |
tree | bf790b63a2af10cc715d92f202ff7bbe133d071b | |
parent | 17f7bde2f730723f6edae66b454afba481595bb0 (diff) | |
download | libgit2-1c947daa80dfa442acbf8119530a3dcbf5af00c5.tar.gz |
branch: Change `git_branch_delete` to take a ref
-rw-r--r-- | include/git2/branch.h | 16 | ||||
-rw-r--r-- | include/git2/refs.h | 10 | ||||
-rw-r--r-- | src/branch.c | 31 | ||||
-rw-r--r-- | src/refs.c | 7 | ||||
-rw-r--r-- | tests-clar/refs/branches/delete.c | 43 |
5 files changed, 51 insertions, 56 deletions
diff --git a/include/git2/branch.h b/include/git2/branch.h index 8bf7eb9d..81105d6e 100644 --- a/include/git2/branch.h +++ b/include/git2/branch.h @@ -55,21 +55,11 @@ GIT_EXTERN(int) git_branch_create( /** * Delete an existing branch reference. * - * @param repo Repository where lives the branch. + * @param branch A valid reference representing a branch * - * @param branch_name Name of the branch to be deleted; - * this name is validated for consistency. - * - * @param branch_type Type of the considered branch. This should - * be valued with either GIT_BRANCH_LOCAL or GIT_BRANCH_REMOTE. - * - * @return 0 on success, GIT_ENOTFOUND if the branch - * doesn't exist or an error code. + * @return 0 on success, or an error code. */ -GIT_EXTERN(int) git_branch_delete( - git_repository *repo, - const char *branch_name, - git_branch_t branch_type); +GIT_EXTERN(int) git_branch_delete(git_reference *branch); /** * Loop over all the branches and issue a callback for each one. diff --git a/include/git2/refs.h b/include/git2/refs.h index 9e706007..975da553 100644 --- a/include/git2/refs.h +++ b/include/git2/refs.h @@ -376,6 +376,16 @@ GIT_EXTERN(int) git_reference_has_log(git_reference *ref); */ GIT_EXTERN(int) git_reference_is_branch(git_reference *ref); +/** + * Check if a reference is a remote tracking branch + * + * @param ref A git reference + * + * @return 1 when the reference lives in the refs/remotes + * namespace; 0 otherwise. + */ +GIT_EXTERN(int) git_reference_is_remote(git_reference *ref); + /** @} */ GIT_END_DECL #endif diff --git a/src/branch.c b/src/branch.c index 52fed67a..da204274 100644 --- a/src/branch.c +++ b/src/branch.c @@ -50,6 +50,12 @@ static int create_error_invalid(const char *msg) return -1; } +static int not_a_local_branch(git_reference *ref) +{ + giterr_set(GITERR_INVALID, "Reference '%s' is not a local branch.", git_reference_name(ref)); + return -1; +} + int git_branch_create( git_reference **ref_out, git_repository *repository, @@ -106,19 +112,19 @@ cleanup: return error; } -int git_branch_delete(git_repository *repo, const char *branch_name, git_branch_t branch_type) +int git_branch_delete(git_reference *branch) { - git_reference *branch = NULL; git_reference *head = NULL; - int error; - assert(repo && branch_name); - assert((branch_type == GIT_BRANCH_LOCAL) || (branch_type == GIT_BRANCH_REMOTE)); + assert(branch); - if ((error = retrieve_branch_reference(&branch, repo, branch_name, branch_type == GIT_BRANCH_REMOTE)) < 0) - return error; + if (!git_reference_is_branch(branch) && + !git_reference_is_remote(branch)) { + giterr_set(GITERR_INVALID, "Reference '%s' is not a valid branch.", git_reference_name(branch)); + return -1; + } - if (git_reference_lookup(&head, repo, GIT_HEAD_FILE) < 0) { + if (git_reference_lookup(&head, git_reference_owner(branch), GIT_HEAD_FILE) < 0) { giterr_set(GITERR_REFERENCE, "Cannot locate HEAD."); goto on_error; } @@ -126,7 +132,7 @@ int git_branch_delete(git_repository *repo, const char *branch_name, git_branch_ if ((git_reference_type(head) == GIT_REF_SYMBOLIC) && (strcmp(git_reference_target(head), git_reference_name(branch)) == 0)) { giterr_set(GITERR_REFERENCE, - "Cannot delete branch '%s' as it is the current HEAD of the repository.", branch_name); + "Cannot delete branch '%s' as it is the current HEAD of the repository.", git_reference_name(branch)); goto on_error; } @@ -138,7 +144,6 @@ int git_branch_delete(git_repository *repo, const char *branch_name, git_branch_ on_error: git_reference_free(head); - git_reference_free(branch); return -1; } @@ -185,12 +190,6 @@ int git_branch_foreach( return git_reference_foreach(repo, GIT_REF_LISTALL, &branch_foreach_cb, (void *)&filter); } -static int not_a_local_branch(git_reference *ref) -{ - giterr_set(GITERR_INVALID, "Reference '%s' is not a local branch.", git_reference_name(ref)); - return -1; -} - int git_branch_move( git_reference *branch, const char *new_branch_name, @@ -1804,6 +1804,11 @@ int git_reference_has_log( int git_reference_is_branch(git_reference *ref) { assert(ref); - return git__prefixcmp(ref->name, GIT_REFS_HEADS_DIR) == 0; } + +int git_reference_is_remote(git_reference *ref) +{ + assert(ref); + return git__prefixcmp(ref->name, GIT_REFS_REMOTES_DIR) == 0; +} diff --git a/tests-clar/refs/branches/delete.c b/tests-clar/refs/branches/delete.c index 699655f2..b261240c 100644 --- a/tests-clar/refs/branches/delete.c +++ b/tests-clar/refs/branches/delete.c @@ -23,37 +23,37 @@ void test_refs_branches_delete__cleanup(void) cl_fixture_cleanup("testrepo.git"); } -void test_refs_branches_delete__can_not_delete_a_non_existing_branch(void) -{ - cl_git_fail(git_branch_delete(repo, "i-am-not-a-local-branch", GIT_BRANCH_LOCAL)); - cl_git_fail(git_branch_delete(repo, "neither/a-remote-one", GIT_BRANCH_REMOTE)); -} - void test_refs_branches_delete__can_not_delete_a_branch_pointed_at_by_HEAD(void) { git_reference *head; + git_reference *branch; /* Ensure HEAD targets the local master branch */ cl_git_pass(git_reference_lookup(&head, repo, GIT_HEAD_FILE)); cl_assert(strcmp("refs/heads/master", git_reference_target(head)) == 0); git_reference_free(head); - cl_git_fail(git_branch_delete(repo, "master", GIT_BRANCH_LOCAL)); + cl_git_pass(git_branch_lookup(&branch, repo, "master", GIT_BRANCH_LOCAL)); + cl_git_fail(git_branch_delete(branch)); + git_reference_free(branch); } void test_refs_branches_delete__can_not_delete_a_branch_if_HEAD_is_missing(void) { git_reference *head; + git_reference *branch = NULL; cl_git_pass(git_reference_lookup(&head, repo, GIT_HEAD_FILE)); git_reference_delete(head); - cl_git_fail(git_branch_delete(repo, "br2", GIT_BRANCH_LOCAL)); + cl_git_pass(git_branch_lookup(&branch, repo, "br2", GIT_BRANCH_LOCAL)); + cl_git_fail(git_branch_delete(branch)); + git_reference_free(branch); } void test_refs_branches_delete__can_delete_a_branch_pointed_at_by_detached_HEAD(void) { - git_reference *master, *head; + git_reference *master, *head, *branch; /* Detach HEAD and make it target the commit that "master" points to */ cl_git_pass(git_reference_lookup(&master, repo, "refs/heads/master")); @@ -61,30 +61,21 @@ void test_refs_branches_delete__can_delete_a_branch_pointed_at_by_detached_HEAD( git_reference_free(head); git_reference_free(master); - cl_git_pass(git_branch_delete(repo, "master", GIT_BRANCH_LOCAL)); + cl_git_pass(git_branch_lookup(&branch, repo, "master", GIT_BRANCH_LOCAL)); + cl_git_pass(git_branch_delete(branch)); } void test_refs_branches_delete__can_delete_a_local_branch(void) { - cl_git_pass(git_branch_delete(repo, "br2", GIT_BRANCH_LOCAL)); + git_reference *branch; + cl_git_pass(git_branch_lookup(&branch, repo, "br2", GIT_BRANCH_LOCAL)); + cl_git_pass(git_branch_delete(branch)); } void test_refs_branches_delete__can_delete_a_remote_branch(void) { - cl_git_pass(git_branch_delete(repo, "nulltoken/master", GIT_BRANCH_REMOTE)); + git_reference *branch; + cl_git_pass(git_branch_lookup(&branch, repo, "nulltoken/master", GIT_BRANCH_REMOTE)); + cl_git_pass(git_branch_delete(branch)); } -static void assert_non_exisitng_branch_removal(const char *branch_name, git_branch_t branch_type) -{ - int error; - error = git_branch_delete(repo, branch_name, branch_type); - - cl_git_fail(error); - cl_assert_equal_i(GIT_ENOTFOUND, error); -} - -void test_refs_branches_delete__deleting_a_non_existing_branch_returns_ENOTFOUND(void) -{ - assert_non_exisitng_branch_removal("i-do-not-locally-exist", GIT_BRANCH_LOCAL); - assert_non_exisitng_branch_removal("neither/remotely", GIT_BRANCH_REMOTE); -} |