Commit 5915d7001b0084356ece3f23c5e7c3f2be17e39c

Carlos Martín Nieto 2014-11-17T14:28:22

branch: consider an empty upstream remote config as not found

diff --git a/src/branch.c b/src/branch.c
index 01402a2..b4e4b05 100644
--- a/src/branch.c
+++ b/src/branch.c
@@ -400,6 +400,12 @@ int git_branch_upstream_remote(git_buf *buf, git_repository *repo, const char *r
 	if ((error = retrieve_upstream_configuration(&str, cfg, refname, "branch.%s.remote")) < 0)
 		goto cleanup;
 
+	if (!*str) {
+		giterr_set(GITERR_REFERENCE, "branch '%s' does not have an upstream remote", refname);
+		error = GIT_ENOTFOUND;
+		goto cleanup;
+	}
+
 	error = git_buf_puts(buf, str);
 
 cleanup:
diff --git a/tests/refs/branches/upstream.c b/tests/refs/branches/upstream.c
index abf7933..b20b937 100644
--- a/tests/refs/branches/upstream.c
+++ b/tests/refs/branches/upstream.c
@@ -70,6 +70,22 @@ void test_refs_branches_upstream__upstream_remote(void)
 	git_buf_free(&buf);
 }
 
+void test_refs_branches_upstream__upstream_remote_empty_value(void)
+{
+	git_repository *repository;
+	git_config *cfg;
+	git_buf buf = GIT_BUF_INIT;
+
+	repository = cl_git_sandbox_init("testrepo.git");
+	cl_git_pass(git_repository_config(&cfg, repository));
+	cl_git_pass(git_config_set_string(cfg, "branch.master.remote", ""));
+	cl_git_fail_with(GIT_ENOTFOUND, git_branch_upstream_remote(&buf, repository, "refs/heads/master"));
+
+	cl_git_pass(git_config_delete_entry(cfg, "branch.master.remote"));
+	cl_git_fail_with(GIT_ENOTFOUND, git_branch_upstream_remote(&buf, repository, "refs/heads/master"));
+	cl_git_sandbox_cleanup();
+}
+
 static void assert_merge_and_or_remote_key_missing(git_repository *repository, const git_commit *target, const char *entry_name)
 {
 	git_reference *branch;