Commit 5014fe95 by Carlos Martín Nieto

branch: error out if we cannot find the remote

When we look for which remote corresponds to a remote-tracking branch,
we look in the refspecs to see which ones matches. If none do, we should
abort. We currently ignore the error message from this operation, so
let's not do that anymore.

As part of the test we're writing, let's test for the expected behaviour
if we cannot find a refspec which tells us what the remote-tracking
branch for a remote would look like.
parent 7cd4ba1b
...@@ -551,7 +551,7 @@ int git_branch_set_upstream(git_reference *branch, const char *upstream_name) ...@@ -551,7 +551,7 @@ int git_branch_set_upstream(git_reference *branch, const char *upstream_name)
git_remote *remote = NULL; git_remote *remote = NULL;
git_config *config; git_config *config;
const char *name, *shortname; const char *name, *shortname;
int local; int local, error;
const git_refspec *fetchspec; const git_refspec *fetchspec;
name = git_reference_name(branch); name = git_reference_name(branch);
...@@ -586,9 +586,12 @@ int git_branch_set_upstream(git_reference *branch, const char *upstream_name) ...@@ -586,9 +586,12 @@ int git_branch_set_upstream(git_reference *branch, const char *upstream_name)
* that. * that.
*/ */
if (local) if (local)
git_buf_puts(&value, "."); error = git_buf_puts(&value, ".");
else else
git_branch_remote_name(&value, repo, git_reference_name(upstream)); error = git_branch_remote_name(&value, repo, git_reference_name(upstream));
if (error < 0)
goto on_error;
if (git_buf_printf(&key, "branch.%s.remote", shortname) < 0) if (git_buf_printf(&key, "branch.%s.remote", shortname) < 0)
goto on_error; goto on_error;
......
...@@ -159,3 +159,35 @@ void test_refs_branches_upstream__set_unset_upstream(void) ...@@ -159,3 +159,35 @@ void test_refs_branches_upstream__set_unset_upstream(void)
cl_git_sandbox_cleanup(); cl_git_sandbox_cleanup();
} }
void test_refs_branches_upstream__no_fetch_refspec(void)
{
git_reference *ref, *branch;
git_repository *repo;
git_remote *remote;
git_config *cfg;
repo = cl_git_sandbox_init("testrepo.git");
cl_git_pass(git_remote_create_with_fetchspec(&remote, repo, "matching", ".", NULL));
cl_git_pass(git_remote_add_push(repo, "matching", ":"));
cl_git_pass(git_reference_lookup(&branch, repo, "refs/heads/test"));
cl_git_pass(git_reference_create(&ref, repo, "refs/remotes/matching/master", git_reference_target(branch), 1, "fetch"));
cl_git_fail(git_branch_set_upstream(branch, "matching/master"));
cl_assert_equal_s("Could not determine remote for 'refs/remotes/matching/master'",
giterr_last()->message);
/* we can't set it automatically, so let's test the user setting it by hand */
cl_git_pass(git_repository_config(&cfg, repo));
cl_git_pass(git_config_set_string(cfg, "branch.test.remote", "matching"));
cl_git_pass(git_config_set_string(cfg, "branch.test.merge", "refs/heads/master"));
/* we still can't find it because there is no rule for that reference */
cl_git_fail_with(GIT_ENOTFOUND, git_branch_upstream(&ref, branch));
git_reference_free(ref);
git_reference_free(branch);
git_remote_free(remote);
cl_git_sandbox_cleanup();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment