Skip to content

Commit f4d2749

Browse files
authored
Add DefaultMergeStyle option to repository (#14789)
Fixes #12293
1 parent 6b836ac commit f4d2749

File tree

11 files changed

+70
-2
lines changed

11 files changed

+70
-2
lines changed

models/repo.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1086,7 +1086,7 @@ func CreateRepository(ctx DBContext, doer, u *User, repo *Repository, overwriteO
10861086
units = append(units, RepoUnit{
10871087
RepoID: repo.ID,
10881088
Type: tp,
1089-
Config: &PullRequestsConfig{AllowMerge: true, AllowRebase: true, AllowRebaseMerge: true, AllowSquash: true},
1089+
Config: &PullRequestsConfig{AllowMerge: true, AllowRebase: true, AllowRebaseMerge: true, AllowSquash: true, DefaultMergeStyle: MergeStyleMerge},
10901090
})
10911091
} else {
10921092
units = append(units, RepoUnit{

models/repo_unit.go

+10
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ type PullRequestsConfig struct {
102102
AllowSquash bool
103103
AllowManualMerge bool
104104
AutodetectManualMerge bool
105+
DefaultMergeStyle MergeStyle
105106
}
106107

107108
// FromDB fills up a PullRequestsConfig from serialized format.
@@ -125,6 +126,15 @@ func (cfg *PullRequestsConfig) IsMergeStyleAllowed(mergeStyle MergeStyle) bool {
125126
mergeStyle == MergeStyleManuallyMerged && cfg.AllowManualMerge
126127
}
127128

129+
// GetDefaultMergeStyle returns the default merge style for this pull request
130+
func (cfg *PullRequestsConfig) GetDefaultMergeStyle() MergeStyle {
131+
if len(cfg.DefaultMergeStyle) != 0 {
132+
return cfg.DefaultMergeStyle
133+
}
134+
135+
return MergeStyleMerge
136+
}
137+
128138
// AllowedMergeStyleCount returns the total count of allowed merge styles for the PullRequestsConfig
129139
func (cfg *PullRequestsConfig) AllowedMergeStyleCount() int {
130140
count := 0

modules/convert/repository.go

+3
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ func innerToRepo(repo *models.Repository, mode models.AccessMode, isParent bool)
7171
allowRebase := false
7272
allowRebaseMerge := false
7373
allowSquash := false
74+
defaultMergeStyle := models.MergeStyleMerge
7475
if unit, err := repo.GetUnit(models.UnitTypePullRequests); err == nil {
7576
config := unit.PullRequestsConfig()
7677
hasPullRequests = true
@@ -79,6 +80,7 @@ func innerToRepo(repo *models.Repository, mode models.AccessMode, isParent bool)
7980
allowRebase = config.AllowRebase
8081
allowRebaseMerge = config.AllowRebaseMerge
8182
allowSquash = config.AllowSquash
83+
defaultMergeStyle = config.GetDefaultMergeStyle()
8284
}
8385
hasProjects := false
8486
if _, err := repo.GetUnit(models.UnitTypeProjects); err == nil {
@@ -139,6 +141,7 @@ func innerToRepo(repo *models.Repository, mode models.AccessMode, isParent bool)
139141
AllowRebase: allowRebase,
140142
AllowRebaseMerge: allowRebaseMerge,
141143
AllowSquash: allowSquash,
144+
DefaultMergeStyle: string(defaultMergeStyle),
142145
AvatarURL: repo.AvatarLink(),
143146
Internal: !repo.IsPrivate && repo.Owner.Visibility == api.VisibleTypePrivate,
144147
MirrorInterval: mirrorInterval,

modules/forms/repo_form.go

+1
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ type RepoSettingForm struct {
140140
PullsAllowRebaseMerge bool
141141
PullsAllowSquash bool
142142
PullsAllowManualMerge bool
143+
PullsDefaultMergeStyle string
143144
EnableAutodetectManualMerge bool
144145
EnableTimetracker bool
145146
AllowOnlyContributorsToTrackTime bool

modules/structs/repo.go

+3
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ type Repository struct {
8989
AllowRebase bool `json:"allow_rebase"`
9090
AllowRebaseMerge bool `json:"allow_rebase_explicit"`
9191
AllowSquash bool `json:"allow_squash_merge"`
92+
DefaultMergeStyle string `json:"default_merge_style"`
9293
AvatarURL string `json:"avatar_url"`
9394
Internal bool `json:"internal"`
9495
MirrorInterval string `json:"mirror_interval"`
@@ -171,6 +172,8 @@ type EditRepoOption struct {
171172
AllowManualMerge *bool `json:"allow_manual_merge,omitempty"`
172173
// either `true` to enable AutodetectManualMerge, or `false` to prevent it. `has_pull_requests` must be `true`, Note: In some special cases, misjudgments can occur.
173174
AutodetectManualMerge *bool `json:"autodetect_manual_merge,omitempty"`
175+
// set to a merge style to be used by this repository: "merge", "rebase", "rebase-merge", or "squash". `has_pull_requests` must be `true`.
176+
DefaultMergeStyle *string `json:"default_merge_style,omitempty"`
174177
// set to `true` to archive this repository.
175178
Archived *bool `json:"archived,omitempty"`
176179
// set to a string like `8h30m0s` to set the mirror interval time

options/locale/locale_en-US.ini

+1
Original file line numberDiff line numberDiff line change
@@ -1791,6 +1791,7 @@ settings.block_on_official_review_requests_desc = Merging will not be possible w
17911791
settings.block_outdated_branch = Block merge if pull request is outdated
17921792
settings.block_outdated_branch_desc = Merging will not be possible when head branch is behind base branch.
17931793
settings.default_branch_desc = Select a default repository branch for pull requests and code commits:
1794+
settings.default_merge_style_desc = Default merge style for pull requests:
17941795
settings.choose_branch = Choose a branch…
17951796
settings.no_protected_branch = There are no protected branches.
17961797
settings.edit_protected_branch = Edit

routers/api/v1/repo/repo.go

+4
Original file line numberDiff line numberDiff line change
@@ -731,6 +731,7 @@ func updateRepoUnits(ctx *context.APIContext, opts api.EditRepoOption) error {
731731
AllowSquash: true,
732732
AllowManualMerge: true,
733733
AutodetectManualMerge: false,
734+
DefaultMergeStyle: models.MergeStyleMerge,
734735
}
735736
} else {
736737
config = unit.PullRequestsConfig()
@@ -757,6 +758,9 @@ func updateRepoUnits(ctx *context.APIContext, opts api.EditRepoOption) error {
757758
if opts.AutodetectManualMerge != nil {
758759
config.AutodetectManualMerge = *opts.AutodetectManualMerge
759760
}
761+
if opts.DefaultMergeStyle != nil {
762+
config.DefaultMergeStyle = models.MergeStyle(*opts.DefaultMergeStyle)
763+
}
760764

761765
units = append(units, models.RepoUnit{
762766
RepoID: repo.ID,

routers/repo/issue.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -1484,7 +1484,10 @@ func ViewIssue(ctx *context.Context) {
14841484
// Check correct values and select default
14851485
if ms, ok := ctx.Data["MergeStyle"].(models.MergeStyle); !ok ||
14861486
!prConfig.IsMergeStyleAllowed(ms) {
1487-
if prConfig.AllowMerge {
1487+
defaultMergeStyle := prConfig.GetDefaultMergeStyle()
1488+
if prConfig.IsMergeStyleAllowed(defaultMergeStyle) && !ok {
1489+
ctx.Data["MergeStyle"] = defaultMergeStyle
1490+
} else if prConfig.AllowMerge {
14881491
ctx.Data["MergeStyle"] = models.MergeStyleMerge
14891492
} else if prConfig.AllowRebase {
14901493
ctx.Data["MergeStyle"] = models.MergeStyleRebase

routers/repo/setting.go

+1
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,7 @@ func SettingsPost(ctx *context.Context) {
322322
AllowSquash: form.PullsAllowSquash,
323323
AllowManualMerge: form.PullsAllowManualMerge,
324324
AutodetectManualMerge: form.EnableAutodetectManualMerge,
325+
DefaultMergeStyle: models.MergeStyle(form.PullsDefaultMergeStyle),
325326
},
326327
})
327328
} else if !models.UnitTypePullRequests.UnitGlobalDisabled() {

templates/repo/settings/options.tmpl

+33
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,39 @@
346346
<label>{{.i18n.Tr "repo.settings.pulls.enable_autodetect_manual_merge"}}</label>
347347
</div>
348348
</div>
349+
<div class="field">
350+
<p>
351+
{{.i18n.Tr "repo.settings.default_merge_style_desc"}}
352+
</p>
353+
<div class="ui dropdown selection" tabindex="0">
354+
<select name="pulls_default_merge_style">
355+
<option value="merge" {{if or (not $pullRequestEnabled) (eq $prUnit.PullRequestsConfig.DefaultMergeStyle "merge")}}selected{{end}}>{{.i18n.Tr "repo.pulls.merge_pull_request"}}</option>
356+
<option value="rebase" {{if or (not $pullRequestEnabled) (eq $prUnit.PullRequestsConfig.DefaultMergeStyle "rebase")}}selected{{end}}>{{.i18n.Tr "repo.pulls.rebase_merge_pull_request"}}</option>
357+
<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>
358+
<option value="squash" {{if or (not $pullRequestEnabled) (eq $prUnit.PullRequestsConfig.DefaultMergeStyle "squash")}}selected{{end}}>{{.i18n.Tr "repo.pulls.squash_merge_pull_request"}}</option>
359+
</select>{{svg "octicon-triangle-down" 14 "dropdown icon"}}
360+
<div class="default text">
361+
{{if (eq $prUnit.PullRequestsConfig.DefaultMergeStyle "merge")}}
362+
{{.i18n.Tr "repo.pulls.merge_pull_request"}}
363+
{{end}}
364+
{{if (eq $prUnit.PullRequestsConfig.DefaultMergeStyle "rebase")}}
365+
{{.i18n.Tr "repo.pulls.rebase_merge_pull_request"}}
366+
{{end}}
367+
{{if (eq $prUnit.PullRequestsConfig.DefaultMergeStyle "rebase-merge")}}
368+
{{.i18n.Tr "repo.pulls.rebase_merge_commit_pull_request"}}
369+
{{end}}
370+
{{if (eq $prUnit.PullRequestsConfig.DefaultMergeStyle "squash")}}
371+
{{.i18n.Tr "repo.pulls.squash_merge_pull_request"}}
372+
{{end}}
373+
</div>
374+
<div class="menu transition hidden" tabindex="-1" style="display: block !important;">
375+
<div class="item" data-value="merge">{{.i18n.Tr "repo.pulls.merge_pull_request"}}</div>
376+
<div class="item" data-value="rebase">{{.i18n.Tr "repo.pulls.rebase_merge_pull_request"}}</div>
377+
<div class="item" data-value="rebase-merge">{{.i18n.Tr "repo.pulls.rebase_merge_commit_pull_request"}}</div>
378+
<div class="item" data-value="squash">{{.i18n.Tr "repo.pulls.squash_merge_pull_request"}}</div>
379+
</div>
380+
</div>
381+
</div>
349382
</div>
350383
{{end}}
351384

templates/swagger/v1_json.tmpl

+9
Original file line numberDiff line numberDiff line change
@@ -13626,6 +13626,11 @@
1362613626
"type": "string",
1362713627
"x-go-name": "DefaultBranch"
1362813628
},
13629+
"default_merge_style": {
13630+
"description": "set to a merge style to be used by this repository: \"merge\", \"rebase\", \"rebase-merge\", or \"squash\". `has_pull_requests` must be `true`.",
13631+
"type": "string",
13632+
"x-go-name": "DefaultMergeStyle"
13633+
},
1362913634
"description": {
1363013635
"description": "a short description of the repository.",
1363113636
"type": "string",
@@ -15676,6 +15681,10 @@
1567615681
"type": "string",
1567715682
"x-go-name": "DefaultBranch"
1567815683
},
15684+
"default_merge_style": {
15685+
"type": "string",
15686+
"x-go-name": "DefaultMergeStyle"
15687+
},
1567915688
"description": {
1568015689
"type": "string",
1568115690
"x-go-name": "Description"

0 commit comments

Comments
 (0)