mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 21:28:11 +09:00 
			
		
		
		
	Auto expand "New PR" form (#33971)
Follow GitHub's behavior: use `?expand=1` to expand the "New PR" form
This commit is contained in:
		| @@ -303,14 +303,11 @@ func HookPostReceive(ctx *gitea_context.PrivateContext) { | |||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			if pr == nil { | 			if pr == nil { | ||||||
| 				if repo.IsFork { |  | ||||||
| 					branch = fmt.Sprintf("%s:%s", repo.OwnerName, branch) |  | ||||||
| 				} |  | ||||||
| 				results = append(results, private.HookPostReceiveBranchResult{ | 				results = append(results, private.HookPostReceiveBranchResult{ | ||||||
| 					Message: setting.Git.PullRequestPushMessage && baseRepo.AllowsPulls(ctx), | 					Message: setting.Git.PullRequestPushMessage && baseRepo.AllowsPulls(ctx), | ||||||
| 					Create:  true, | 					Create:  true, | ||||||
| 					Branch:  branch, | 					Branch:  branch, | ||||||
| 					URL:     fmt.Sprintf("%s/compare/%s...%s", baseRepo.HTMLURL(), util.PathEscapeSegments(baseRepo.DefaultBranch), util.PathEscapeSegments(branch)), | 					URL:     fmt.Sprintf("%s/pulls/new/%s", repo.HTMLURL(), util.PathEscapeSegments(branch)), | ||||||
| 				}) | 				}) | ||||||
| 			} else { | 			} else { | ||||||
| 				results = append(results, private.HookPostReceiveBranchResult{ | 				results = append(results, private.HookPostReceiveBranchResult{ | ||||||
|   | |||||||
| @@ -569,19 +569,13 @@ func PrepareCompareDiff( | |||||||
| 	ctx *context.Context, | 	ctx *context.Context, | ||||||
| 	ci *common.CompareInfo, | 	ci *common.CompareInfo, | ||||||
| 	whitespaceBehavior git.TrustedCmdArgs, | 	whitespaceBehavior git.TrustedCmdArgs, | ||||||
| ) bool { | ) (nothingToCompare bool) { | ||||||
| 	var ( | 	repo := ctx.Repo.Repository | ||||||
| 		repo  = ctx.Repo.Repository |  | ||||||
| 		err   error |  | ||||||
| 		title string |  | ||||||
| 	) |  | ||||||
|  |  | ||||||
| 	// Get diff information. |  | ||||||
| 	ctx.Data["CommitRepoLink"] = ci.HeadRepo.Link() |  | ||||||
|  |  | ||||||
| 	headCommitID := ci.CompareInfo.HeadCommitID | 	headCommitID := ci.CompareInfo.HeadCommitID | ||||||
|  |  | ||||||
|  | 	ctx.Data["CommitRepoLink"] = ci.HeadRepo.Link() | ||||||
| 	ctx.Data["AfterCommitID"] = headCommitID | 	ctx.Data["AfterCommitID"] = headCommitID | ||||||
|  | 	ctx.Data["ExpandNewPrForm"] = ctx.FormBool("expand") | ||||||
|  |  | ||||||
| 	if (headCommitID == ci.CompareInfo.MergeBase && !ci.DirectComparison) || | 	if (headCommitID == ci.CompareInfo.MergeBase && !ci.DirectComparison) || | ||||||
| 		headCommitID == ci.CompareInfo.BaseCommitID { | 		headCommitID == ci.CompareInfo.BaseCommitID { | ||||||
| @@ -670,6 +664,7 @@ func PrepareCompareDiff( | |||||||
| 	ctx.Data["Commits"] = commits | 	ctx.Data["Commits"] = commits | ||||||
| 	ctx.Data["CommitCount"] = len(commits) | 	ctx.Data["CommitCount"] = len(commits) | ||||||
|  |  | ||||||
|  | 	title := ci.HeadBranch | ||||||
| 	if len(commits) == 1 { | 	if len(commits) == 1 { | ||||||
| 		c := commits[0] | 		c := commits[0] | ||||||
| 		title = strings.TrimSpace(c.UserCommit.Summary()) | 		title = strings.TrimSpace(c.UserCommit.Summary()) | ||||||
| @@ -678,9 +673,8 @@ func PrepareCompareDiff( | |||||||
| 		if len(body) > 1 { | 		if len(body) > 1 { | ||||||
| 			ctx.Data["content"] = strings.Join(body[1:], "\n") | 			ctx.Data["content"] = strings.Join(body[1:], "\n") | ||||||
| 		} | 		} | ||||||
| 	} else { |  | ||||||
| 		title = ci.HeadBranch |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if len(title) > 255 { | 	if len(title) > 255 { | ||||||
| 		var trailer string | 		var trailer string | ||||||
| 		title, trailer = util.EllipsisDisplayStringX(title, 255) | 		title, trailer = util.EllipsisDisplayStringX(title, 255) | ||||||
| @@ -745,8 +739,7 @@ func CompareDiff(ctx *context.Context) { | |||||||
| 		ctx.Data["OtherCompareSeparator"] = "..." | 		ctx.Data["OtherCompareSeparator"] = "..." | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	nothingToCompare := PrepareCompareDiff(ctx, ci, | 	nothingToCompare := PrepareCompareDiff(ctx, ci, gitdiff.GetWhitespaceFlag(ctx.Data["WhitespaceBehavior"].(string))) | ||||||
| 		gitdiff.GetWhitespaceFlag(ctx.Data["WhitespaceBehavior"].(string))) |  | ||||||
| 	if ctx.Written() { | 	if ctx.Written() { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -1269,6 +1269,21 @@ func stopTimerIfAvailable(ctx *context.Context, user *user_model.User, issue *is | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func PullsNewRedirect(ctx *context.Context) { | ||||||
|  | 	branch := ctx.PathParam("*") | ||||||
|  | 	redirectRepo := ctx.Repo.Repository | ||||||
|  | 	repo := ctx.Repo.Repository | ||||||
|  | 	if repo.IsFork { | ||||||
|  | 		if err := repo.GetBaseRepo(ctx); err != nil { | ||||||
|  | 			ctx.ServerError("GetBaseRepo", err) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		redirectRepo = repo.BaseRepo | ||||||
|  | 		branch = fmt.Sprintf("%s:%s", repo.OwnerName, branch) | ||||||
|  | 	} | ||||||
|  | 	ctx.Redirect(fmt.Sprintf("%s/compare/%s...%s?expand=1", redirectRepo.Link(), util.PathEscapeSegments(redirectRepo.DefaultBranch), util.PathEscapeSegments(branch))) | ||||||
|  | } | ||||||
|  |  | ||||||
| // CompareAndPullRequestPost response for creating pull request | // CompareAndPullRequestPost response for creating pull request | ||||||
| func CompareAndPullRequestPost(ctx *context.Context) { | func CompareAndPullRequestPost(ctx *context.Context) { | ||||||
| 	form := web.GetForm(ctx).(*forms.CreateIssueForm) | 	form := web.GetForm(ctx).(*forms.CreateIssueForm) | ||||||
|   | |||||||
| @@ -1185,6 +1185,7 @@ func registerRoutes(m *web.Router) { | |||||||
| 		m.Combo("/compare/*", repo.MustBeNotEmpty, repo.SetEditorconfigIfExists). | 		m.Combo("/compare/*", repo.MustBeNotEmpty, repo.SetEditorconfigIfExists). | ||||||
| 			Get(repo.SetDiffViewStyle, repo.SetWhitespaceBehavior, repo.CompareDiff). | 			Get(repo.SetDiffViewStyle, repo.SetWhitespaceBehavior, repo.CompareDiff). | ||||||
| 			Post(reqSignIn, context.RepoMustNotBeArchived(), reqUnitPullsReader, repo.MustAllowPulls, web.Bind(forms.CreateIssueForm{}), repo.SetWhitespaceBehavior, repo.CompareAndPullRequestPost) | 			Post(reqSignIn, context.RepoMustNotBeArchived(), reqUnitPullsReader, repo.MustAllowPulls, web.Bind(forms.CreateIssueForm{}), repo.SetWhitespaceBehavior, repo.CompareAndPullRequestPost) | ||||||
|  | 		m.Get("/pulls/new/*", repo.PullsNewRedirect) | ||||||
| 	}, optSignIn, context.RepoAssignment, reqUnitCodeReader) | 	}, optSignIn, context.RepoAssignment, reqUnitCodeReader) | ||||||
| 	// end "/{username}/{reponame}": repo code: find, compare, list | 	// end "/{username}/{reponame}": repo code: find, compare, list | ||||||
|  |  | ||||||
|   | |||||||
| @@ -128,13 +128,13 @@ | |||||||
| 											{{svg "octicon-git-pull-request"}} {{ctx.Locale.Tr "repo.branch.included"}} | 											{{svg "octicon-git-pull-request"}} {{ctx.Locale.Tr "repo.branch.included"}} | ||||||
| 										</span> | 										</span> | ||||||
| 									{{else if and (not .DBBranch.IsDeleted) $.AllowsPulls (gt .CommitsAhead 0)}} | 									{{else if and (not .DBBranch.IsDeleted) $.AllowsPulls (gt .CommitsAhead 0)}} | ||||||
| 									<a href="{{$.RepoLink}}/compare/{{PathEscapeSegments $.DefaultBranchBranch.DBBranch.Name}}...{{if ne $.Repository.Owner.Name $.Owner.Name}}{{PathEscape $.Owner.Name}}:{{end}}{{PathEscapeSegments .DBBranch.Name}}"> | 									<a href="{{$.RepoLink}}/compare/{{PathEscapeSegments $.DefaultBranchBranch.DBBranch.Name}}...{{if ne $.Repository.Owner.Name $.Owner.Name}}{{PathEscape $.Owner.Name}}:{{end}}{{PathEscapeSegments .DBBranch.Name}}?expand=1"> | ||||||
| 										<button id="new-pull-request" class="ui compact basic button tw-mr-0">{{if $.CanPull}}{{ctx.Locale.Tr "repo.pulls.compare_changes"}}{{else}}{{ctx.Locale.Tr "action.compare_branch"}}{{end}}</button> | 										<button id="new-pull-request" class="ui compact basic button tw-mr-0">{{if $.CanPull}}{{ctx.Locale.Tr "repo.pulls.compare_changes"}}{{else}}{{ctx.Locale.Tr "action.compare_branch"}}{{end}}</button> | ||||||
| 									</a> | 									</a> | ||||||
| 									{{end}} | 									{{end}} | ||||||
| 								{{else if and .LatestPullRequest.HasMerged .MergeMovedOn}} | 								{{else if and .LatestPullRequest.HasMerged .MergeMovedOn}} | ||||||
| 									{{if and (not .DBBranch.IsDeleted) $.AllowsPulls (gt .CommitsAhead 0)}} | 									{{if and (not .DBBranch.IsDeleted) $.AllowsPulls (gt .CommitsAhead 0)}} | ||||||
| 									<a href="{{$.RepoLink}}/compare/{{PathEscapeSegments $.DefaultBranchBranch.DBBranch.Name}}...{{if ne $.Repository.Owner.Name $.Owner.Name}}{{PathEscape $.Owner.Name}}:{{end}}{{PathEscapeSegments .DBBranch.Name}}"> | 									<a href="{{$.RepoLink}}/compare/{{PathEscapeSegments $.DefaultBranchBranch.DBBranch.Name}}...{{if ne $.Repository.Owner.Name $.Owner.Name}}{{PathEscape $.Owner.Name}}:{{end}}{{PathEscapeSegments .DBBranch.Name}}?expand=1"> | ||||||
| 										<button id="new-pull-request" class="ui compact basic button tw-mr-0">{{if $.CanPull}}{{ctx.Locale.Tr "repo.pulls.compare_changes"}}{{else}}{{ctx.Locale.Tr "action.compare_branch"}}{{end}}</button> | 										<button id="new-pull-request" class="ui compact basic button tw-mr-0">{{if $.CanPull}}{{ctx.Locale.Tr "repo.pulls.compare_changes"}}{{else}}{{ctx.Locale.Tr "action.compare_branch"}}{{end}}</button> | ||||||
| 									</a> | 									</a> | ||||||
| 									{{end}} | 									{{end}} | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ | |||||||
| 			{{$branchLink := HTMLFormat `<a href="%s">%s</a>` .BranchLink .BranchDisplayName}} | 			{{$branchLink := HTMLFormat `<a href="%s">%s</a>` .BranchLink .BranchDisplayName}} | ||||||
| 			{{ctx.Locale.Tr "repo.pulls.recently_pushed_new_branches" $branchLink $timeSince}} | 			{{ctx.Locale.Tr "repo.pulls.recently_pushed_new_branches" $branchLink $timeSince}} | ||||||
| 		</div> | 		</div> | ||||||
| 		<a role="button" class="ui compact green button tw-m-0" href="{{.BranchCompareURL}}"> | 		<a role="button" class="ui compact green button tw-m-0" href="{{QueryBuild .BranchCompareURL "expand" 1}}"> | ||||||
| 			{{ctx.Locale.Tr "repo.pulls.compare_changes"}} | 			{{ctx.Locale.Tr "repo.pulls.compare_changes"}} | ||||||
| 		</a> | 		</a> | ||||||
| 	</div> | 	</div> | ||||||
|   | |||||||
| @@ -205,10 +205,10 @@ | |||||||
| 					{{end}} | 					{{end}} | ||||||
| 				</div> | 				</div> | ||||||
| 			{{else if $allowCreatePR}} | 			{{else if $allowCreatePR}} | ||||||
| 				<div class="ui info message pullrequest-form-toggle {{if .Flash}}tw-hidden{{end}}"> | 				<div class="ui info message pullrequest-form-toggle {{if .ExpandNewPrForm}}tw-hidden{{end}}"> | ||||||
| 					<button class="ui button primary show-panel toggle" data-panel=".pullrequest-form-toggle, .pullrequest-form">{{ctx.Locale.Tr "repo.pulls.new"}}</button> | 					<button class="ui button primary show-panel toggle" data-panel=".pullrequest-form-toggle, .pullrequest-form">{{ctx.Locale.Tr "repo.pulls.new"}}</button> | ||||||
| 				</div> | 				</div> | ||||||
| 				<div class="pullrequest-form {{if not .Flash}}tw-hidden{{end}}"> | 				<div class="pullrequest-form {{if not .ExpandNewPrForm}}tw-hidden{{end}}"> | ||||||
| 					{{template "repo/issue/new_form" .}} | 					{{template "repo/issue/new_form" .}} | ||||||
| 				</div> | 				</div> | ||||||
| 			{{end}} | 			{{end}} | ||||||
|   | |||||||
| @@ -30,7 +30,7 @@ | |||||||
| 		{{end}} | 		{{end}} | ||||||
| 		{{$cmpBranch = print $cmpBranch (.BranchName|PathEscapeSegments)}} | 		{{$cmpBranch = print $cmpBranch (.BranchName|PathEscapeSegments)}} | ||||||
| 		{{$compareLink := printf "%s/compare/%s...%s" .BaseRepo.Link (.BaseRepo.DefaultBranch|PathEscapeSegments) $cmpBranch}} | 		{{$compareLink := printf "%s/compare/%s...%s" .BaseRepo.Link (.BaseRepo.DefaultBranch|PathEscapeSegments) $cmpBranch}} | ||||||
| 		<a id="new-pull-request" role="button" class="ui compact basic button" href="{{$compareLink}}" | 		<a id="new-pull-request" role="button" class="ui compact basic button" href="{{QueryBuild $compareLink "expand" 1}}" | ||||||
| 			data-tooltip-content="{{if .PullRequestCtx.Allowed}}{{ctx.Locale.Tr "repo.pulls.compare_changes"}}{{else}}{{ctx.Locale.Tr "action.compare_branch"}}{{end}}"> | 			data-tooltip-content="{{if .PullRequestCtx.Allowed}}{{ctx.Locale.Tr "repo.pulls.compare_changes"}}{{else}}{{ctx.Locale.Tr "action.compare_branch"}}{{end}}"> | ||||||
| 			{{svg "octicon-git-pull-request"}} | 			{{svg "octicon-git-pull-request"}} | ||||||
| 		</a> | 		</a> | ||||||
|   | |||||||
| @@ -24,13 +24,27 @@ import ( | |||||||
| func TestPullCompare(t *testing.T) { | func TestPullCompare(t *testing.T) { | ||||||
| 	defer tests.PrepareTestEnv(t)() | 	defer tests.PrepareTestEnv(t)() | ||||||
|  |  | ||||||
|  | 	t.Run("PullsNewRedirect", func(t *testing.T) { | ||||||
|  | 		req := NewRequest(t, "GET", "/user2/repo1/pulls/new/foo") | ||||||
|  | 		resp := MakeRequest(t, req, http.StatusSeeOther) | ||||||
|  | 		redirect := test.RedirectURL(resp) | ||||||
|  | 		assert.Equal(t, "/user2/repo1/compare/master...foo?expand=1", redirect) | ||||||
|  |  | ||||||
|  | 		req = NewRequest(t, "GET", "/user13/repo11/pulls/new/foo") | ||||||
|  | 		resp = MakeRequest(t, req, http.StatusSeeOther) | ||||||
|  | 		redirect = test.RedirectURL(resp) | ||||||
|  | 		assert.Equal(t, "/user12/repo10/compare/master...user13:foo?expand=1", redirect) | ||||||
|  | 	}) | ||||||
|  |  | ||||||
|  | 	t.Run("ButtonsExist", func(t *testing.T) { | ||||||
| 		session := loginUser(t, "user2") | 		session := loginUser(t, "user2") | ||||||
|  |  | ||||||
|  | 		// test the "New PR" button | ||||||
| 		req := NewRequest(t, "GET", "/user2/repo1/pulls") | 		req := NewRequest(t, "GET", "/user2/repo1/pulls") | ||||||
| 		resp := session.MakeRequest(t, req, http.StatusOK) | 		resp := session.MakeRequest(t, req, http.StatusOK) | ||||||
| 		htmlDoc := NewHTMLParser(t, resp.Body) | 		htmlDoc := NewHTMLParser(t, resp.Body) | ||||||
| 		link, exists := htmlDoc.doc.Find(".new-pr-button").Attr("href") | 		link, exists := htmlDoc.doc.Find(".new-pr-button").Attr("href") | ||||||
| 		assert.True(t, exists, "The template has changed") | 		assert.True(t, exists, "The template has changed") | ||||||
|  |  | ||||||
| 		req = NewRequest(t, "GET", link) | 		req = NewRequest(t, "GET", link) | ||||||
| 		resp = session.MakeRequest(t, req, http.StatusOK) | 		resp = session.MakeRequest(t, req, http.StatusOK) | ||||||
| 		assert.EqualValues(t, http.StatusOK, resp.Code) | 		assert.EqualValues(t, http.StatusOK, resp.Code) | ||||||
| @@ -41,6 +55,7 @@ func TestPullCompare(t *testing.T) { | |||||||
| 		doc := NewHTMLParser(t, resp.Body) | 		doc := NewHTMLParser(t, resp.Body) | ||||||
| 		editButtonCount := doc.doc.Find(".diff-file-header-actions a[href*='/_edit/']").Length() | 		editButtonCount := doc.doc.Find(".diff-file-header-actions a[href*='/_edit/']").Length() | ||||||
| 		assert.Positive(t, editButtonCount, "Expected to find a button to edit a file in the PR diff view but there were none") | 		assert.Positive(t, editButtonCount, "Expected to find a button to edit a file in the PR diff view but there were none") | ||||||
|  | 	}) | ||||||
|  |  | ||||||
| 	onGiteaRun(t, func(t *testing.T, u *url.URL) { | 	onGiteaRun(t, func(t *testing.T, u *url.URL) { | ||||||
| 		defer tests.PrepareTestEnv(t)() | 		defer tests.PrepareTestEnv(t)() | ||||||
| @@ -54,8 +69,8 @@ func TestPullCompare(t *testing.T) { | |||||||
| 		repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerName: "user2", Name: "repo1"}) | 		repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerName: "user2", Name: "repo1"}) | ||||||
| 		issueIndex := unittest.AssertExistsAndLoadBean(t, &issues_model.IssueIndex{GroupID: repo1.ID}, unittest.OrderBy("group_id ASC")) | 		issueIndex := unittest.AssertExistsAndLoadBean(t, &issues_model.IssueIndex{GroupID: repo1.ID}, unittest.OrderBy("group_id ASC")) | ||||||
| 		prFilesURL := fmt.Sprintf("/user2/repo1/pulls/%d/files", issueIndex.MaxIndex) | 		prFilesURL := fmt.Sprintf("/user2/repo1/pulls/%d/files", issueIndex.MaxIndex) | ||||||
| 		req = NewRequest(t, "GET", prFilesURL) | 		req := NewRequest(t, "GET", prFilesURL) | ||||||
| 		resp = session.MakeRequest(t, req, http.StatusOK) | 		resp := session.MakeRequest(t, req, http.StatusOK) | ||||||
| 		doc := NewHTMLParser(t, resp.Body) | 		doc := NewHTMLParser(t, resp.Body) | ||||||
| 		editButtonCount := doc.doc.Find(".diff-file-header-actions a[href*='/_edit/']").Length() | 		editButtonCount := doc.doc.Find(".diff-file-header-actions a[href*='/_edit/']").Length() | ||||||
| 		assert.Positive(t, editButtonCount, "Expected to find a button to edit a file in the PR diff view but there were none") | 		assert.Positive(t, editButtonCount, "Expected to find a button to edit a file in the PR diff view but there were none") | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user