@@ -16,6 +16,13 @@ import (
1616
1717func (prInfo * pullRequestViewInfo ) prepareMergeBoxFormProps (ctx * context.Context ) {
1818 pull := prInfo .issue .PullRequest
19+ if pull .HasMerged || prInfo .issue .IsClosed {
20+ return
21+ }
22+ if ! prInfo .MergeBoxData .allowMerge {
23+ return
24+ }
25+
1926 prConfig := ctx .Repo .Repository .MustGetUnit (ctx , unit .TypePullRequests ).PullRequestsConfig ()
2027
2128 // Check correct values and select default
@@ -69,7 +76,7 @@ func (prInfo *pullRequestViewInfo) prepareMergeBoxFormProps(ctx *context.Context
6976 }
7077
7178 allOverridableChecksOk := ! prInfo .MergeBoxData .HasOverridableBlockers
72- prInfo . MergeBoxData . MergeFormProps = map [string ]any {
79+ mergeFormProps : = map [string ]any {
7380 "baseLink" : prInfo .issue .Link (),
7481 "textCancel" : ctx .Locale .Tr ("cancel" ),
7582 "textDeleteBranch" : ctx .Locale .Tr ("repo.branch.delete" , prInfo .headTarget ),
@@ -97,51 +104,75 @@ func (prInfo *pullRequestViewInfo) prepareMergeBoxFormProps(ctx *context.Context
97104 // if this pr can be merged now, then hide the auto merge
98105 generalHideAutoMerge := prInfo .MergeBoxData .CanMergeNow && allOverridableChecksOk
99106
100- prInfo .MergeBoxData .MergeFormProps ["mergeStyles" ] = []any {
101- map [string ]any {
102- "name" : "merge" ,
103- "allowed" : prConfig .AllowMerge ,
104- "textDoMerge" : ctx .Locale .Tr ("repo.pulls.merge_pull_request" ),
105- "mergeTitleFieldText" : defaultMergeTitle ,
106- "mergeMessageFieldText" : defaultMergeBody ,
107- "hideAutoMerge" : generalHideAutoMerge ,
108- },
109- map [string ]any {
110- "name" : "rebase" ,
111- "allowed" : prConfig .AllowRebase ,
112- "textDoMerge" : ctx .Locale .Tr ("repo.pulls.rebase_merge_pull_request" ),
113- "hideMergeMessageTexts" : true ,
114- "hideAutoMerge" : generalHideAutoMerge ,
115- },
116- map [string ]any {
117- "name" : "rebase-merge" ,
118- "allowed" : prConfig .AllowRebaseMerge ,
119- "textDoMerge" : ctx .Locale .Tr ("repo.pulls.rebase_merge_commit_pull_request" ),
120- "mergeTitleFieldText" : defaultMergeTitle ,
121- "mergeMessageFieldText" : defaultMergeBody ,
122- "hideAutoMerge" : generalHideAutoMerge ,
123- },
124- map [string ]any {
125- "name" : "squash" ,
126- "allowed" : prConfig .AllowSquash ,
127- "textDoMerge" : ctx .Locale .Tr ("repo.pulls.squash_merge_pull_request" ),
128- "mergeTitleFieldText" : defaultSquashMergeTitle ,
129- "mergeMessageFieldText" : defaultSquashMergeCommitMessages + defaultSquashMergeBody ,
130- "hideAutoMerge" : generalHideAutoMerge ,
131- },
132- map [string ]any {
133- "name" : "fast-forward-only" ,
134- "allowed" : prConfig .AllowFastForwardOnly && pull .CommitsBehind == 0 ,
135- "textDoMerge" : ctx .Locale .Tr ("repo.pulls.fast_forward_only_merge_pull_request" ),
136- "hideMergeMessageTexts" : true ,
137- "hideAutoMerge" : generalHideAutoMerge ,
138- },
139- map [string ]any {
107+ var mergeStyles []any
108+ if pull .IsStatusMergeable () {
109+ mergeStyles = []any {
110+ map [string ]any {
111+ "name" : "merge" ,
112+ "allowed" : prConfig .AllowMerge ,
113+ "textDoMerge" : ctx .Locale .Tr ("repo.pulls.merge_pull_request" ),
114+ "mergeTitleFieldText" : defaultMergeTitle ,
115+ "mergeMessageFieldText" : defaultMergeBody ,
116+ "hideAutoMerge" : generalHideAutoMerge ,
117+ },
118+ map [string ]any {
119+ "name" : "rebase" ,
120+ "allowed" : prConfig .AllowRebase ,
121+ "textDoMerge" : ctx .Locale .Tr ("repo.pulls.rebase_merge_pull_request" ),
122+ "hideMergeMessageTexts" : true ,
123+ "hideAutoMerge" : generalHideAutoMerge ,
124+ },
125+ map [string ]any {
126+ "name" : "rebase-merge" ,
127+ "allowed" : prConfig .AllowRebaseMerge ,
128+ "textDoMerge" : ctx .Locale .Tr ("repo.pulls.rebase_merge_commit_pull_request" ),
129+ "mergeTitleFieldText" : defaultMergeTitle ,
130+ "mergeMessageFieldText" : defaultMergeBody ,
131+ "hideAutoMerge" : generalHideAutoMerge ,
132+ },
133+ map [string ]any {
134+ "name" : "squash" ,
135+ "allowed" : prConfig .AllowSquash ,
136+ "textDoMerge" : ctx .Locale .Tr ("repo.pulls.squash_merge_pull_request" ),
137+ "mergeTitleFieldText" : defaultSquashMergeTitle ,
138+ "mergeMessageFieldText" : defaultSquashMergeCommitMessages + defaultSquashMergeBody ,
139+ "hideAutoMerge" : generalHideAutoMerge ,
140+ },
141+ map [string ]any {
142+ "name" : "fast-forward-only" ,
143+ "allowed" : prConfig .AllowFastForwardOnly && pull .CommitsBehind == 0 ,
144+ "textDoMerge" : ctx .Locale .Tr ("repo.pulls.fast_forward_only_merge_pull_request" ),
145+ "hideMergeMessageTexts" : true ,
146+ "hideAutoMerge" : generalHideAutoMerge ,
147+ },
148+ }
149+ }
150+
151+ canUseManualMerge := func () bool {
152+ if pull .IsWorkInProgress (ctx ) || pull .IsChecking () {
153+ return false
154+ }
155+ return prConfig .AllowManualMerge
156+ }
157+ // Manually Merged is not a well-known feature, it is used to mark a non-mergeable PR (already merged, conflicted) as merged
158+ // To test it:
159+ // Enable "Manually Merged" feature in the Repository Settings
160+ // Create a pull request, either:
161+ // - Merge the pull request branch locally and push the merged commit to Gitea
162+ // - Make some conflicts between the base branch and the pull request branch
163+ // Then the Manually Merged form will be shown in the merge form
164+ if canUseManualMerge () {
165+ mergeStyles = append (mergeStyles , map [string ]any {
140166 "name" : "manually-merged" ,
141167 "allowed" : prConfig .AllowManualMerge ,
142168 "textDoMerge" : ctx .Locale .Tr ("repo.pulls.merge_manually" ),
143169 "hideMergeMessageTexts" : true ,
144170 "hideAutoMerge" : true ,
145- },
171+ })
172+ }
173+
174+ if len (mergeStyles ) > 0 {
175+ mergeFormProps ["mergeStyles" ] = mergeStyles
176+ prInfo .MergeBoxData .MergeFormProps = mergeFormProps
146177 }
147178}
0 commit comments