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
					
						
							
								a681daaca2
							
						
					
				
			
			
				commit
				
					
						1dfe58ad11
					
				
			
		
					 2 changed files with 65 additions and 3 deletions
				
			
		|  | @ -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. | ||||
| 	headRepo := repo_model.GetForkedRepo(ctx, headUser.ID, baseRepo.ID) | ||||
| 	if headRepo == nil && !isSameRepo { | ||||
| 		log.Trace("parseCompareInfo[%d]: does not have fork or in same repository", baseRepo.ID) | ||||
| 		ctx.NotFound("GetForkedRepo") | ||||
| 		return nil, nil, nil, "", "" | ||||
| 		err := baseRepo.GetBaseRepo(ctx) | ||||
| 		if err != 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 | ||||
|  |  | |||
|  | @ -72,6 +72,30 @@ func testPullCreate(t *testing.T, session *TestSession, user, repo string, toSel | |||
| 	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) { | ||||
| 	onGiteaRun(t, func(t *testing.T, u *url.URL) { | ||||
| 		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…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Job
				Job