mirror of
https://codeberg.org/forgejo/forgejo
synced 2024-11-29 05:06:11 +01:00
Fix PR creation on forked repositories (#31863)
Resolves #20475 (cherry picked from commit 7e68bc88238104d2ee8b5a877fc1ad437f1778a4) Conflicts: tests/integration/pull_create_test.go add missing testPullCreateDirectly from c63060b130d34e3f03f28f4dccbf04d381a95c17 Fix code owners will not be mentioned when a pull request comes from a forked repository (#30476)
This commit is contained in:
parent
4cb10ff28a
commit
7d3a013e5e
|
@ -1112,9 +1112,20 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption)
|
||||||
// Check if current user has fork of repository or in the same repository.
|
// Check if current user has fork of repository or in the same repository.
|
||||||
headRepo := repo_model.GetForkedRepo(ctx, headUser.ID, baseRepo.ID)
|
headRepo := repo_model.GetForkedRepo(ctx, headUser.ID, baseRepo.ID)
|
||||||
if headRepo == nil && !isSameRepo {
|
if headRepo == nil && !isSameRepo {
|
||||||
log.Trace("parseCompareInfo[%d]: does not have fork or in same repository", baseRepo.ID)
|
err := baseRepo.GetBaseRepo(ctx)
|
||||||
ctx.NotFound("GetForkedRepo")
|
if err != nil {
|
||||||
return nil, nil, nil, "", ""
|
ctx.Error(http.StatusInternalServerError, "GetBaseRepo", err)
|
||||||
|
return nil, nil, nil, "", ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if baseRepo's base repository is the same as headUser's repository.
|
||||||
|
if baseRepo.BaseRepo == nil || baseRepo.BaseRepo.OwnerID != headUser.ID {
|
||||||
|
log.Trace("parseCompareInfo[%d]: does not have fork or in same repository", baseRepo.ID)
|
||||||
|
ctx.NotFound("GetBaseRepo")
|
||||||
|
return nil, nil, nil, "", ""
|
||||||
|
}
|
||||||
|
// Assign headRepo so it can be used below.
|
||||||
|
headRepo = baseRepo.BaseRepo
|
||||||
}
|
}
|
||||||
|
|
||||||
var headGitRepo *git.Repository
|
var headGitRepo *git.Repository
|
||||||
|
|
|
@ -72,6 +72,30 @@ func testPullCreate(t *testing.T, session *TestSession, user, repo string, toSel
|
||||||
return resp
|
return resp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testPullCreateDirectly(t *testing.T, session *TestSession, baseRepoOwner, baseRepoName, baseBranch, headRepoOwner, headRepoName, headBranch, title string) *httptest.ResponseRecorder {
|
||||||
|
headCompare := headBranch
|
||||||
|
if headRepoOwner != "" {
|
||||||
|
if headRepoName != "" {
|
||||||
|
headCompare = fmt.Sprintf("%s/%s:%s", headRepoOwner, headRepoName, headBranch)
|
||||||
|
} else {
|
||||||
|
headCompare = fmt.Sprintf("%s:%s", headRepoOwner, headBranch)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
req := NewRequest(t, "GET", fmt.Sprintf("/%s/%s/compare/%s...%s", baseRepoOwner, baseRepoName, baseBranch, headCompare))
|
||||||
|
resp := session.MakeRequest(t, req, http.StatusOK)
|
||||||
|
|
||||||
|
// Submit the form for creating the pull
|
||||||
|
htmlDoc := NewHTMLParser(t, resp.Body)
|
||||||
|
link, exists := htmlDoc.doc.Find("form.ui.form").Attr("action")
|
||||||
|
assert.True(t, exists, "The template has changed")
|
||||||
|
req = NewRequestWithValues(t, "POST", link, map[string]string{
|
||||||
|
"_csrf": htmlDoc.GetCSRF(),
|
||||||
|
"title": title,
|
||||||
|
})
|
||||||
|
resp = session.MakeRequest(t, req, http.StatusOK)
|
||||||
|
return resp
|
||||||
|
}
|
||||||
|
|
||||||
func TestPullCreate(t *testing.T) {
|
func TestPullCreate(t *testing.T) {
|
||||||
onGiteaRun(t, func(t *testing.T, u *url.URL) {
|
onGiteaRun(t, func(t *testing.T, u *url.URL) {
|
||||||
session := loginUser(t, "user1")
|
session := loginUser(t, "user1")
|
||||||
|
@ -505,3 +529,30 @@ func TestRecentlyPushed(t *testing.T) {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Setup:
|
||||||
|
The base repository is: user2/repo1
|
||||||
|
Fork repository to: user1/repo1
|
||||||
|
Push extra commit to: user2/repo1, which changes README.md
|
||||||
|
Create a PR on user1/repo1
|
||||||
|
|
||||||
|
Test checks:
|
||||||
|
Check if pull request can be created from base to the fork repository.
|
||||||
|
*/
|
||||||
|
func TestPullCreatePrFromBaseToFork(t *testing.T) {
|
||||||
|
onGiteaRun(t, func(t *testing.T, u *url.URL) {
|
||||||
|
sessionFork := loginUser(t, "user1")
|
||||||
|
testRepoFork(t, sessionFork, "user2", "repo1", "user1", "repo1")
|
||||||
|
|
||||||
|
// Edit base repository
|
||||||
|
sessionBase := loginUser(t, "user2")
|
||||||
|
testEditFile(t, sessionBase, "user2", "repo1", "master", "README.md", "Hello, World (Edited)\n")
|
||||||
|
|
||||||
|
// Create a PR
|
||||||
|
resp := testPullCreateDirectly(t, sessionFork, "user1", "repo1", "master", "user2", "repo1", "master", "This is a pull title")
|
||||||
|
// check the redirected URL
|
||||||
|
url := test.RedirectURL(resp)
|
||||||
|
assert.Regexp(t, "^/user1/repo1/pulls/[0-9]*$", url)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue