Skip to content

Commit 7ede430

Browse files
committed
Add a fast-forward-only merge style. (#24906)
1 parent 01acd1e commit 7ede430

File tree

19 files changed

+84
-4
lines changed

19 files changed

+84
-4
lines changed

models/repo/git.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ const (
2121
MergeStyleRebaseMerge MergeStyle = "rebase-merge"
2222
// MergeStyleSquash squash commits into single commit before merging
2323
MergeStyleSquash MergeStyle = "squash"
24+
// MergeStyleFastForwardOnly fast-forward merge if possible, otherwise fail
25+
MergeStyleFastForwardOnly MergeStyle = "fast-forward-only"
2426
// MergeStyleManuallyMerged pr has been merged manually, just mark it as merged directly
2527
MergeStyleManuallyMerged MergeStyle = "manually-merged"
2628
// MergeStyleRebaseUpdate not a merge style, used to update pull head by rebase

models/repo/repo_unit.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ type PullRequestsConfig struct {
122122
AllowRebase bool
123123
AllowRebaseMerge bool
124124
AllowSquash bool
125+
AllowFastForwardOnly bool
125126
AllowManualMerge bool
126127
AutodetectManualMerge bool
127128
AllowRebaseUpdate bool
@@ -148,6 +149,7 @@ func (cfg *PullRequestsConfig) IsMergeStyleAllowed(mergeStyle MergeStyle) bool {
148149
mergeStyle == MergeStyleRebase && cfg.AllowRebase ||
149150
mergeStyle == MergeStyleRebaseMerge && cfg.AllowRebaseMerge ||
150151
mergeStyle == MergeStyleSquash && cfg.AllowSquash ||
152+
mergeStyle == MergeStyleFastForwardOnly && cfg.AllowFastForwardOnly ||
151153
mergeStyle == MergeStyleManuallyMerged && cfg.AllowManualMerge
152154
}
153155

modules/git/error.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func (err ErrBranchNotExist) Unwrap() error {
9696
return util.ErrNotExist
9797
}
9898

99-
// ErrPushOutOfDate represents an error if merging fails due to unrelated histories
99+
// ErrPushOutOfDate represents an error if merging fails due to the base branch being updated
100100
type ErrPushOutOfDate struct {
101101
StdOut string
102102
StdErr string

modules/repository/create.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,11 @@ func CreateRepositoryByExample(ctx context.Context, doer, u *user_model.User, re
8787
units = append(units, repo_model.RepoUnit{
8888
RepoID: repo.ID,
8989
Type: tp,
90-
Config: &repo_model.PullRequestsConfig{AllowMerge: true, AllowRebase: true, AllowRebaseMerge: true, AllowSquash: true, DefaultMergeStyle: repo_model.MergeStyle(setting.Repository.PullRequest.DefaultMergeStyle), AllowRebaseUpdate: true},
90+
Config: &repo_model.PullRequestsConfig{
91+
AllowMerge: true, AllowRebase: true, AllowRebaseMerge: true, AllowSquash: true, AllowFastForwardOnly: true,
92+
DefaultMergeStyle: repo_model.MergeStyle(setting.Repository.PullRequest.DefaultMergeStyle),
93+
AllowRebaseUpdate: true,
94+
},
9195
})
9296
} else {
9397
units = append(units, repo_model.RepoUnit{

modules/structs/repo.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ type Repository struct {
9898
AllowRebase bool `json:"allow_rebase"`
9999
AllowRebaseMerge bool `json:"allow_rebase_explicit"`
100100
AllowSquash bool `json:"allow_squash_merge"`
101+
AllowFastForwardOnly bool `json:"allow_fast_forward_only_merge"`
101102
AllowRebaseUpdate bool `json:"allow_rebase_update"`
102103
DefaultDeleteBranchAfterMerge bool `json:"default_delete_branch_after_merge"`
103104
DefaultMergeStyle string `json:"default_merge_style"`
@@ -195,6 +196,8 @@ type EditRepoOption struct {
195196
AllowRebaseMerge *bool `json:"allow_rebase_explicit,omitempty"`
196197
// either `true` to allow squash-merging pull requests, or `false` to prevent squash-merging.
197198
AllowSquash *bool `json:"allow_squash_merge,omitempty"`
199+
// either `true` to allow fast-forward-only merging pull requests, or `false` to prevent fast-forward-only merging.
200+
AllowFastForwardOnly *bool `json:"allow_fast_forward_only_merge,omitempty"`
198201
// either `true` to allow mark pr as merged manually, or `false` to prevent it.
199202
AllowManualMerge *bool `json:"allow_manual_merge,omitempty"`
200203
// either `true` to enable AutodetectManualMerge, or `false` to prevent it. Note: In some special cases, misjudgments can occur.

options/locale/locale_en-US.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1775,6 +1775,7 @@ pulls.merge_pull_request = Create merge commit
17751775
pulls.rebase_merge_pull_request = Rebase then fast-forward
17761776
pulls.rebase_merge_commit_pull_request = Rebase then create merge commit
17771777
pulls.squash_merge_pull_request = Create squash commit
1778+
pulls.fast_forward_only_merge_pull_request = Fast-forward
17781779
pulls.merge_manually = Manually merged
17791780
pulls.merge_commit_id = The merge commit ID
17801781
pulls.require_signed_wont_sign = The branch requires signed commits but this merge will not be signed

routers/api/v1/repo/repo.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -883,6 +883,7 @@ func updateRepoUnits(ctx *context.APIContext, opts api.EditRepoOption) error {
883883
AllowRebase: true,
884884
AllowRebaseMerge: true,
885885
AllowSquash: true,
886+
AllowFastForwardOnly: true,
886887
AllowManualMerge: true,
887888
AutodetectManualMerge: false,
888889
AllowRebaseUpdate: true,
@@ -909,6 +910,9 @@ func updateRepoUnits(ctx *context.APIContext, opts api.EditRepoOption) error {
909910
if opts.AllowSquash != nil {
910911
config.AllowSquash = *opts.AllowSquash
911912
}
913+
if opts.AllowFastForwardOnly != nil {
914+
config.AllowFastForwardOnly = *opts.AllowFastForwardOnly
915+
}
912916
if opts.AllowManualMerge != nil {
913917
config.AllowManualMerge = *opts.AllowManualMerge
914918
}

routers/api/v1/repo/repo_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ func TestRepoEdit(t *testing.T) {
3535
allowRebase := false
3636
allowRebaseMerge := false
3737
allowSquashMerge := false
38+
allowFastForwardOnlyMerge := false
3839
archived := true
3940
opts := api.EditRepoOption{
4041
Name: &ctx.Repo.Repository.Name,
@@ -50,6 +51,7 @@ func TestRepoEdit(t *testing.T) {
5051
AllowRebase: &allowRebase,
5152
AllowRebaseMerge: &allowRebaseMerge,
5253
AllowSquash: &allowSquashMerge,
54+
AllowFastForwardOnly: &allowFastForwardOnlyMerge,
5355
Archived: &archived,
5456
}
5557

routers/web/repo/issue.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1862,6 +1862,8 @@ func ViewIssue(ctx *context.Context) {
18621862
mergeStyle = repo_model.MergeStyleRebaseMerge
18631863
} else if prConfig.AllowSquash {
18641864
mergeStyle = repo_model.MergeStyleSquash
1865+
} else if prConfig.AllowFastForwardOnly {
1866+
mergeStyle = repo_model.MergeStyleFastForwardOnly
18651867
} else if prConfig.AllowManualMerge {
18661868
mergeStyle = repo_model.MergeStyleManuallyMerged
18671869
}

routers/web/repo/setting/setting.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,7 @@ func SettingsPost(ctx *context.Context) {
576576
AllowRebase: form.PullsAllowRebase,
577577
AllowRebaseMerge: form.PullsAllowRebaseMerge,
578578
AllowSquash: form.PullsAllowSquash,
579+
AllowFastForwardOnly: form.PullsAllowFastForwardOnly,
579580
AllowManualMerge: form.PullsAllowManualMerge,
580581
AutodetectManualMerge: form.EnableAutodetectManualMerge,
581582
AllowRebaseUpdate: form.PullsAllowRebaseUpdate,

0 commit comments

Comments
 (0)