]> source.dussan.org Git - gitea.git/commitdiff
Add DefaultMergeStyle option to repository (#14789)
authorparnic <github@parnic.com>
Sat, 27 Mar 2021 14:55:40 +0000 (09:55 -0500)
committerGitHub <noreply@github.com>
Sat, 27 Mar 2021 14:55:40 +0000 (15:55 +0100)
Fixes #12293

models/repo.go
models/repo_unit.go
modules/convert/repository.go
modules/forms/repo_form.go
modules/structs/repo.go
options/locale/locale_en-US.ini
routers/api/v1/repo/repo.go
routers/repo/issue.go
routers/repo/setting.go
templates/repo/settings/options.tmpl
templates/swagger/v1_json.tmpl

index 329e63cc421b62445b1e0369f88ef2f5a96ccb2d..c807916ddc3a34a7b59a6f1ef34eb856383a0fb1 100644 (file)
@@ -1086,7 +1086,7 @@ func CreateRepository(ctx DBContext, doer, u *User, repo *Repository, overwriteO
                        units = append(units, RepoUnit{
                                RepoID: repo.ID,
                                Type:   tp,
-                               Config: &PullRequestsConfig{AllowMerge: true, AllowRebase: true, AllowRebaseMerge: true, AllowSquash: true},
+                               Config: &PullRequestsConfig{AllowMerge: true, AllowRebase: true, AllowRebaseMerge: true, AllowSquash: true, DefaultMergeStyle: MergeStyleMerge},
                        })
                } else {
                        units = append(units, RepoUnit{
index 7702697ffae0a25075556bb4e73d77298d936540..1d54579a6e7276d89aa8aac33c7c9fa172cd41fa 100644 (file)
@@ -102,6 +102,7 @@ type PullRequestsConfig struct {
        AllowSquash               bool
        AllowManualMerge          bool
        AutodetectManualMerge     bool
+       DefaultMergeStyle         MergeStyle
 }
 
 // FromDB fills up a PullRequestsConfig from serialized format.
@@ -125,6 +126,15 @@ func (cfg *PullRequestsConfig) IsMergeStyleAllowed(mergeStyle MergeStyle) bool {
                mergeStyle == MergeStyleManuallyMerged && cfg.AllowManualMerge
 }
 
+// GetDefaultMergeStyle returns the default merge style for this pull request
+func (cfg *PullRequestsConfig) GetDefaultMergeStyle() MergeStyle {
+       if len(cfg.DefaultMergeStyle) != 0 {
+               return cfg.DefaultMergeStyle
+       }
+
+       return MergeStyleMerge
+}
+
 // AllowedMergeStyleCount returns the total count of allowed merge styles for the PullRequestsConfig
 func (cfg *PullRequestsConfig) AllowedMergeStyleCount() int {
        count := 0
index 813201ca6844cf6a73be836cc73025199f136c7e..63a22bb04ead6c9e8b964f9a167a595376f1a7c0 100644 (file)
@@ -71,6 +71,7 @@ func innerToRepo(repo *models.Repository, mode models.AccessMode, isParent bool)
        allowRebase := false
        allowRebaseMerge := false
        allowSquash := false
+       defaultMergeStyle := models.MergeStyleMerge
        if unit, err := repo.GetUnit(models.UnitTypePullRequests); err == nil {
                config := unit.PullRequestsConfig()
                hasPullRequests = true
@@ -79,6 +80,7 @@ func innerToRepo(repo *models.Repository, mode models.AccessMode, isParent bool)
                allowRebase = config.AllowRebase
                allowRebaseMerge = config.AllowRebaseMerge
                allowSquash = config.AllowSquash
+               defaultMergeStyle = config.GetDefaultMergeStyle()
        }
        hasProjects := false
        if _, err := repo.GetUnit(models.UnitTypeProjects); err == nil {
@@ -139,6 +141,7 @@ func innerToRepo(repo *models.Repository, mode models.AccessMode, isParent bool)
                AllowRebase:               allowRebase,
                AllowRebaseMerge:          allowRebaseMerge,
                AllowSquash:               allowSquash,
+               DefaultMergeStyle:         string(defaultMergeStyle),
                AvatarURL:                 repo.AvatarLink(),
                Internal:                  !repo.IsPrivate && repo.Owner.Visibility == api.VisibleTypePrivate,
                MirrorInterval:            mirrorInterval,
index 6c7c9bea138d8cad625764ec7eb2ac6dee7eeb14..d9eb06d194db56a11cfd5ba72ca536da792dc26b 100644 (file)
@@ -140,6 +140,7 @@ type RepoSettingForm struct {
        PullsAllowRebaseMerge                 bool
        PullsAllowSquash                      bool
        PullsAllowManualMerge                 bool
+       PullsDefaultMergeStyle                string
        EnableAutodetectManualMerge           bool
        EnableTimetracker                     bool
        AllowOnlyContributorsToTrackTime      bool
index c47700cd009341dc5cdc622758de449f203be749..c23bd1033f1cb29a4fae314d71d6bb762aae618b 100644 (file)
@@ -89,6 +89,7 @@ type Repository struct {
        AllowRebase               bool             `json:"allow_rebase"`
        AllowRebaseMerge          bool             `json:"allow_rebase_explicit"`
        AllowSquash               bool             `json:"allow_squash_merge"`
+       DefaultMergeStyle         string           `json:"default_merge_style"`
        AvatarURL                 string           `json:"avatar_url"`
        Internal                  bool             `json:"internal"`
        MirrorInterval            string           `json:"mirror_interval"`
@@ -171,6 +172,8 @@ type EditRepoOption struct {
        AllowManualMerge *bool `json:"allow_manual_merge,omitempty"`
        // either `true` to enable AutodetectManualMerge, or `false` to prevent it. `has_pull_requests` must be `true`, Note: In some special cases, misjudgments can occur.
        AutodetectManualMerge *bool `json:"autodetect_manual_merge,omitempty"`
+       // set to a merge style to be used by this repository: "merge", "rebase", "rebase-merge", or "squash". `has_pull_requests` must be `true`.
+       DefaultMergeStyle *string `json:"default_merge_style,omitempty"`
        // set to `true` to archive this repository.
        Archived *bool `json:"archived,omitempty"`
        // set to a string like `8h30m0s` to set the mirror interval time
index e679e1e874979c6ffad163c5f188e5a405465e2a..3a8783930efb5e11563f7f3f84b61dc7b299c5a1 100644 (file)
@@ -1791,6 +1791,7 @@ settings.block_on_official_review_requests_desc = Merging will not be possible w
 settings.block_outdated_branch = Block merge if pull request is outdated
 settings.block_outdated_branch_desc = Merging will not be possible when head branch is behind base branch.
 settings.default_branch_desc = Select a default repository branch for pull requests and code commits:
+settings.default_merge_style_desc = Default merge style for pull requests:
 settings.choose_branch = Choose a branch…
 settings.no_protected_branch = There are no protected branches.
 settings.edit_protected_branch = Edit
index b7ed2951ad663c98333991d709893c65d2d5ca71..c422feb04327e2a0ab4b0967f198d384fcd7acef 100644 (file)
@@ -731,6 +731,7 @@ func updateRepoUnits(ctx *context.APIContext, opts api.EditRepoOption) error {
                                        AllowSquash:               true,
                                        AllowManualMerge:          true,
                                        AutodetectManualMerge:     false,
+                                       DefaultMergeStyle:         models.MergeStyleMerge,
                                }
                        } else {
                                config = unit.PullRequestsConfig()
@@ -757,6 +758,9 @@ func updateRepoUnits(ctx *context.APIContext, opts api.EditRepoOption) error {
                        if opts.AutodetectManualMerge != nil {
                                config.AutodetectManualMerge = *opts.AutodetectManualMerge
                        }
+                       if opts.DefaultMergeStyle != nil {
+                               config.DefaultMergeStyle = models.MergeStyle(*opts.DefaultMergeStyle)
+                       }
 
                        units = append(units, models.RepoUnit{
                                RepoID: repo.ID,
index 15459cd0e6d3bc6eb19679d0850ce96ae46395ac..c2969ca4bdf6317b29ff99f1ece09f07c471e684 100644 (file)
@@ -1484,7 +1484,10 @@ func ViewIssue(ctx *context.Context) {
                // Check correct values and select default
                if ms, ok := ctx.Data["MergeStyle"].(models.MergeStyle); !ok ||
                        !prConfig.IsMergeStyleAllowed(ms) {
-                       if prConfig.AllowMerge {
+                       defaultMergeStyle := prConfig.GetDefaultMergeStyle()
+                       if prConfig.IsMergeStyleAllowed(defaultMergeStyle) && !ok {
+                               ctx.Data["MergeStyle"] = defaultMergeStyle
+                       } else if prConfig.AllowMerge {
                                ctx.Data["MergeStyle"] = models.MergeStyleMerge
                        } else if prConfig.AllowRebase {
                                ctx.Data["MergeStyle"] = models.MergeStyleRebase
index dc14b69b3b0b090c913620f7baba2d5bf7cd64fd..8349164d4c62f0e94759671f3cd27a867e2d13b1 100644 (file)
@@ -322,6 +322,7 @@ func SettingsPost(ctx *context.Context) {
                                        AllowSquash:               form.PullsAllowSquash,
                                        AllowManualMerge:          form.PullsAllowManualMerge,
                                        AutodetectManualMerge:     form.EnableAutodetectManualMerge,
+                                       DefaultMergeStyle:         models.MergeStyle(form.PullsDefaultMergeStyle),
                                },
                        })
                } else if !models.UnitTypePullRequests.UnitGlobalDisabled() {
index f944eb8d8dea01bc8c9113f7e0b21f527357ada7..514a2f5c0a9ff5d1a5401d18482438c74097b416 100644 (file)
                                                                <label>{{.i18n.Tr "repo.settings.pulls.enable_autodetect_manual_merge"}}</label>
                                                        </div>
                                                </div>
+                                               <div class="field">
+                                                       <p>
+                                                               {{.i18n.Tr "repo.settings.default_merge_style_desc"}}
+                                                       </p>
+                                                       <div class="ui dropdown selection" tabindex="0">
+                                                               <select name="pulls_default_merge_style">
+                                                                       <option value="merge" {{if or (not $pullRequestEnabled) (eq $prUnit.PullRequestsConfig.DefaultMergeStyle "merge")}}selected{{end}}>{{.i18n.Tr "repo.pulls.merge_pull_request"}}</option>
+                                                                       <option value="rebase" {{if or (not $pullRequestEnabled) (eq $prUnit.PullRequestsConfig.DefaultMergeStyle "rebase")}}selected{{end}}>{{.i18n.Tr "repo.pulls.rebase_merge_pull_request"}}</option>
+                                                                       <option value="rebase-merge" {{if or (not $pullRequestEnabled) (eq $prUnit.PullRequestsConfig.DefaultMergeStyle "rebase-merge")}}selected{{end}}>{{.i18n.Tr "repo.pulls.rebase_merge_commit_pull_request"}}</option>
+                                                                       <option value="squash" {{if or (not $pullRequestEnabled) (eq $prUnit.PullRequestsConfig.DefaultMergeStyle "squash")}}selected{{end}}>{{.i18n.Tr "repo.pulls.squash_merge_pull_request"}}</option>
+                                                               </select>{{svg "octicon-triangle-down" 14 "dropdown icon"}}
+                                                               <div class="default text">
+                                                                       {{if (eq $prUnit.PullRequestsConfig.DefaultMergeStyle "merge")}}
+                                                                               {{.i18n.Tr "repo.pulls.merge_pull_request"}}
+                                                                       {{end}}
+                                                                       {{if (eq $prUnit.PullRequestsConfig.DefaultMergeStyle "rebase")}}
+                                                                               {{.i18n.Tr "repo.pulls.rebase_merge_pull_request"}}
+                                                                       {{end}}
+                                                                       {{if (eq $prUnit.PullRequestsConfig.DefaultMergeStyle "rebase-merge")}}
+                                                                               {{.i18n.Tr "repo.pulls.rebase_merge_commit_pull_request"}}
+                                                                       {{end}}
+                                                                       {{if (eq $prUnit.PullRequestsConfig.DefaultMergeStyle "squash")}}
+                                                                               {{.i18n.Tr "repo.pulls.squash_merge_pull_request"}}
+                                                                       {{end}}
+                                                               </div>
+                                                               <div class="menu transition hidden" tabindex="-1" style="display: block !important;">
+                                                                       <div class="item" data-value="merge">{{.i18n.Tr "repo.pulls.merge_pull_request"}}</div>
+                                                                       <div class="item" data-value="rebase">{{.i18n.Tr "repo.pulls.rebase_merge_pull_request"}}</div>
+                                                                       <div class="item" data-value="rebase-merge">{{.i18n.Tr "repo.pulls.rebase_merge_commit_pull_request"}}</div>
+                                                                       <div class="item" data-value="squash">{{.i18n.Tr "repo.pulls.squash_merge_pull_request"}}</div>
+                                                               </div>
+                                                       </div>
+                                               </div>
                                        </div>
                                {{end}}
 
index d44583b816843768020284c7cf4e67bc3c1c90e5..120d020958e53c1fb6ee68734801a35d82251f74 100644 (file)
           "type": "string",
           "x-go-name": "DefaultBranch"
         },
+        "default_merge_style": {
+          "description": "set to a merge style to be used by this repository: \"merge\", \"rebase\", \"rebase-merge\", or \"squash\". `has_pull_requests` must be `true`.",
+          "type": "string",
+          "x-go-name": "DefaultMergeStyle"
+        },
         "description": {
           "description": "a short description of the repository.",
           "type": "string",
           "type": "string",
           "x-go-name": "DefaultBranch"
         },
+        "default_merge_style": {
+          "type": "string",
+          "x-go-name": "DefaultMergeStyle"
+        },
         "description": {
           "type": "string",
           "x-go-name": "Description"