summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@edwardthomson.com>2019-02-25 09:25:34 +0000
committerGitHub <noreply@github.com>2019-02-25 09:25:34 +0000
commit68729289213bf211ebd0c1b5f8a39648629a8693 (patch)
tree35516357c9cb177d3e3bedb74f6a17028ebf513e
parent5a6a3c00acbd42038b50d830c7dd4a0c5c52052c (diff)
parentc5d8e3006d98023d1540f1404b28a5db1ca0ecd2 (diff)
downloadlibgit2-68729289213bf211ebd0c1b5f8a39648629a8693.tar.gz
Merge pull request #5000 from augfab/branch_lookup_all
Have git_branch_lookup accept GIT_BRANCH_ALL
-rw-r--r--src/branch.c18
-rw-r--r--tests/refs/branches/lookup.c27
2 files changed, 41 insertions, 4 deletions
diff --git a/src/branch.c b/src/branch.c
index 7c6d747b4..a93db7e5b 100644
--- a/src/branch.c
+++ b/src/branch.c
@@ -22,7 +22,7 @@ static int retrieve_branch_reference(
git_reference **branch_reference_out,
git_repository *repo,
const char *branch_name,
- int is_remote)
+ bool is_remote)
{
git_reference *branch = NULL;
int error = 0;
@@ -334,9 +334,23 @@ int git_branch_lookup(
const char *branch_name,
git_branch_t branch_type)
{
+ int error = -1;
assert(ref_out && repo && branch_name);
- return retrieve_branch_reference(ref_out, repo, branch_name, branch_type == GIT_BRANCH_REMOTE);
+ switch (branch_type) {
+ case GIT_BRANCH_LOCAL:
+ case GIT_BRANCH_REMOTE:
+ error = retrieve_branch_reference(ref_out, repo, branch_name, branch_type == GIT_BRANCH_REMOTE);
+ break;
+ case GIT_BRANCH_ALL:
+ error = retrieve_branch_reference(ref_out, repo, branch_name, false);
+ if (error == GIT_ENOTFOUND)
+ error = retrieve_branch_reference(ref_out, repo, branch_name, true);
+ break;
+ default:
+ assert(false);
+ }
+ return error;
}
int git_branch_name(
diff --git a/tests/refs/branches/lookup.c b/tests/refs/branches/lookup.c
index 95d49a4b3..ef0c1f97d 100644
--- a/tests/refs/branches/lookup.c
+++ b/tests/refs/branches/lookup.c
@@ -20,20 +20,41 @@ void test_refs_branches_lookup__cleanup(void)
repo = NULL;
}
-void test_refs_branches_lookup__can_retrieve_a_local_branch(void)
+void test_refs_branches_lookup__can_retrieve_a_local_branch_local(void)
{
cl_git_pass(git_branch_lookup(&branch, repo, "br2", GIT_BRANCH_LOCAL));
}
-void test_refs_branches_lookup__can_retrieve_a_remote_tracking_branch(void)
+void test_refs_branches_lookup__can_retrieve_a_local_branch_all(void)
+{
+ cl_git_pass(git_branch_lookup(&branch, repo, "br2", GIT_BRANCH_ALL));
+}
+
+void test_refs_branches_lookup__trying_to_retrieve_a_local_branch_remote(void)
+{
+ cl_git_fail(git_branch_lookup(&branch, repo, "br2", GIT_BRANCH_REMOTE));
+}
+
+void test_refs_branches_lookup__can_retrieve_a_remote_tracking_branch_remote(void)
{
cl_git_pass(git_branch_lookup(&branch, repo, "test/master", GIT_BRANCH_REMOTE));
}
+void test_refs_branches_lookup__can_retrieve_a_remote_tracking_branch_all(void)
+{
+ cl_git_pass(git_branch_lookup(&branch, repo, "test/master", GIT_BRANCH_ALL));
+}
+
+void test_refs_branches_lookup__trying_to_retrieve_a_remote_tracking_branch_local(void)
+{
+ cl_git_fail(git_branch_lookup(&branch, repo, "test/master", GIT_BRANCH_LOCAL));
+}
+
void test_refs_branches_lookup__trying_to_retrieve_an_unknown_branch_returns_ENOTFOUND(void)
{
cl_assert_equal_i(GIT_ENOTFOUND, git_branch_lookup(&branch, repo, "where/are/you", GIT_BRANCH_LOCAL));
cl_assert_equal_i(GIT_ENOTFOUND, git_branch_lookup(&branch, repo, "over/here", GIT_BRANCH_REMOTE));
+ cl_assert_equal_i(GIT_ENOTFOUND, git_branch_lookup(&branch, repo, "maybe/here", GIT_BRANCH_ALL));
}
void test_refs_branches_lookup__trying_to_retrieve_a_branch_with_an_invalid_name_returns_EINVALIDSPEC(void)
@@ -42,4 +63,6 @@ void test_refs_branches_lookup__trying_to_retrieve_a_branch_with_an_invalid_name
git_branch_lookup(&branch, repo, "are/you/inv@{id", GIT_BRANCH_LOCAL));
cl_assert_equal_i(GIT_EINVALIDSPEC,
git_branch_lookup(&branch, repo, "yes/i am", GIT_BRANCH_REMOTE));
+ cl_assert_equal_i(GIT_EINVALIDSPEC,
+ git_branch_lookup(&branch, repo, "inv al/id", GIT_BRANCH_ALL));
}