diff --git a/remote.c b/remote.c index d15d34aad7..98665a3085 100644 --- a/remote.c +++ b/remote.c @@ -1972,16 +1972,19 @@ static char *branch_get_push_simple(struct repository *repo, struct branch *branch, struct strbuf *err) { - const char *up; + const char *up = NULL; char *cur; - up = branch_get_upstream(branch, err); - if (!up) - return NULL; + if (!strcmp(remote->name, + remotes_remote_for_branch(repo->remote_state, branch, NULL))) { + up = branch_get_upstream(branch, err); + if (!up) + return NULL; + } cur = tracking_for_push_dest(repo, remote, branch->refname, err); if (!cur) return NULL; - if (strcmp(cur, up)) { + if (up && strcmp(cur, up)) { free(cur); return error_buf(err, _("cannot resolve 'simple' push to a single destination")); diff --git a/t/for-each-ref-tests.sh b/t/for-each-ref-tests.sh index b1a10dd933..4991a82b91 100644 --- a/t/for-each-ref-tests.sh +++ b/t/for-each-ref-tests.sh @@ -1745,9 +1745,11 @@ test_expect_success ':remotename and :remoteref' ' ' test_expect_success '%(push) with an invalid push-simple config' ' + test_when_finished "git config branch.main.merge refs/heads/main" && + git config branch.main.merge refs/heads/not-main && echo "refs/heads/main " >expect && git -c push.default=simple \ - -c remote.pushdefault=myfork \ + -c remote.pushdefault=origin \ for-each-ref \ --format="%(refname) %(push)" refs/heads/main >actual && test_cmp expect actual diff --git a/t/t1514-rev-parse-push.sh b/t/t1514-rev-parse-push.sh index 5a4f16867a..dc2df7eb80 100755 --- a/t/t1514-rev-parse-push.sh +++ b/t/t1514-rev-parse-push.sh @@ -39,7 +39,7 @@ test_expect_success '@{push} with default=simple' ' resolve main@{pUSh} refs/remotes/origin/main ' -test_expect_success 'triangular @{push} fails with default=simple' ' +test_expect_success '@{push} with default=simple fails when upstream has a different name' ' test_config push.default simple && test_must_fail git rev-parse topic@{push} ' @@ -60,6 +60,17 @@ test_expect_success '@{push} with pushremote defined' ' resolve topic@{push} refs/remotes/other/topic ' +test_expect_success 'triangular @{push} with default=simple and remote.pushdefault' ' + test_config push.default simple && + test_config remote.pushdefault other && + test_when_finished "git checkout main" && + git checkout topic && + test_commit simple-triangular && + git push && + resolve topic@{push} refs/remotes/other/topic && + test_cmp_rev topic topic@{push} +' + test_expect_success '@{p} is short for @{push}' ' test_config push.default current && test_config branch.topic.pushremote other &&