Merge requests show live mergeability and gain a signed merge-commit mode.
Mergeability: a background check per repository (merge-tree) reports checking, up to date, behind N or conflict with paths. It is stored, exposed in the API (feature merge_requests.mergeability), published as a Watch event for every settled result on new branch tips, and shown live in the CLI and the web merge box. Failed checks retry per repository with backoff (1 s to 1 min, 5 attempts).
Merge modes: fast-forward (requires up to date), squash (uses the merge-tree tree, so a behind but clean branch can be squashed) and merge commit (two parents, signed by the instance key, see 'ermite signing-key show'). Every mode is allowed by default; existing repos are upgraded once. Restrict with 'ermite repo edit --merge-modes'.
Merge answer: a refused merge re-renders the page with an inline error (409), never an error page. Post-merge side effects (source branch deletion, events) run after the response.
Requires bnema.dev/ermite-api v0.10.0.
Checks: build, vet, hexcheck -fail-on warn, go test -count=1 ./..., race on usecase and app, JS tests.
// Mergeability provides a mock function for the type MergeRequestService
946
+
func (_mock *MergeRequestService) Mergeability(ctx context.Context, p domain.Principal, name domain.RepoName, number int64) (domain.Mergeability, error) {
947
+
ret := _mock.Called(ctx, p, name, number)
948
+
949
+
if len(ret) == 0 {
950
+
panic("no return value specified for Mergeability")
951
+
}
952
+
953
+
var r0 domain.Mergeability
954
+
var r1 error
955
+
if returnFunc, ok := ret.Get(0).(func(context.Context, domain.Principal, domain.RepoName, int64) (domain.Mergeability, error)); ok {
956
+
return returnFunc(ctx, p, name, number)
957
+
}
958
+
if returnFunc, ok := ret.Get(0).(func(context.Context, domain.Principal, domain.RepoName, int64) domain.Mergeability); ok {
959
+
r0 = returnFunc(ctx, p, name, number)
960
+
} else {
961
+
r0 = ret.Get(0).(domain.Mergeability)
962
+
}
963
+
if returnFunc, ok := ret.Get(1).(func(context.Context, domain.Principal, domain.RepoName, int64) error); ok {
964
+
r1 = returnFunc(ctx, p, name, number)
965
+
} else {
966
+
r1 = ret.Error(1)
967
+
}
968
+
return r0, r1
969
+
}
970
+
971
+
// MergeRequestService_Mergeability_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Mergeability'
972
+
type MergeRequestService_Mergeability_Call struct {
973
+
*mock.Call
974
+
}
975
+
976
+
// Mergeability is a helper method to define mock.On call
977
+
// - ctx context.Context
978
+
// - p domain.Principal
979
+
// - name domain.RepoName
980
+
// - number int64
981
+
func (_e *MergeRequestService_Expecter) Mergeability(ctx any, p any, name any, number any) *MergeRequestService_Mergeability_Call {
func (_c *MergeRequestService_Mergeability_Call) Run(run func(ctx context.Context, p domain.Principal, name domain.RepoName, number int64)) *MergeRequestService_Mergeability_Call {
// Mergeability provides a mock function for the type MergeRequestService
946
+
func (_mock *MergeRequestService) Mergeability(ctx context.Context, p domain.Principal, name domain.RepoName, number int64) (domain.Mergeability, error) {
947
+
ret := _mock.Called(ctx, p, name, number)
948
+
949
+
if len(ret) == 0 {
950
+
panic("no return value specified for Mergeability")
951
+
}
952
+
953
+
var r0 domain.Mergeability
954
+
var r1 error
955
+
if returnFunc, ok := ret.Get(0).(func(context.Context, domain.Principal, domain.RepoName, int64) (domain.Mergeability, error)); ok {
956
+
return returnFunc(ctx, p, name, number)
957
+
}
958
+
if returnFunc, ok := ret.Get(0).(func(context.Context, domain.Principal, domain.RepoName, int64) domain.Mergeability); ok {
959
+
r0 = returnFunc(ctx, p, name, number)
960
+
} else {
961
+
r0 = ret.Get(0).(domain.Mergeability)
962
+
}
963
+
if returnFunc, ok := ret.Get(1).(func(context.Context, domain.Principal, domain.RepoName, int64) error); ok {
964
+
r1 = returnFunc(ctx, p, name, number)
965
+
} else {
966
+
r1 = ret.Error(1)
967
+
}
968
+
return r0, r1
969
+
}
970
+
971
+
// MergeRequestService_Mergeability_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Mergeability'
972
+
type MergeRequestService_Mergeability_Call struct {
973
+
*mock.Call
974
+
}
975
+
976
+
// Mergeability is a helper method to define mock.On call
977
+
// - ctx context.Context
978
+
// - p domain.Principal
979
+
// - name domain.RepoName
980
+
// - number int64
981
+
func (_e *MergeRequestService_Expecter) Mergeability(ctx any, p any, name any, number any) *MergeRequestService_Mergeability_Call {
func (_c *MergeRequestService_Mergeability_Call) Run(run func(ctx context.Context, p domain.Principal, name domain.RepoName, number int64)) *MergeRequestService_Mergeability_Call {
panic("no return value specified for DeleteMergeability")
188
+
}
189
+
190
+
var r0 error
191
+
if returnFunc, ok := ret.Get(0).(func(context.Context, domain.RepoName, int64) error); ok {
192
+
r0 = returnFunc(ctx, repo, number)
193
+
} else {
194
+
r0 = ret.Error(0)
195
+
}
196
+
return r0
197
+
}
198
+
199
+
// MergeRequestStore_DeleteMergeability_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteMergeability'
200
+
type MergeRequestStore_DeleteMergeability_Call struct {
201
+
*mock.Call
202
+
}
203
+
204
+
// DeleteMergeability is a helper method to define mock.On call
panic("no return value specified for DeleteMergeability")
188
+
}
189
+
190
+
var r0 error
191
+
if returnFunc, ok := ret.Get(0).(func(context.Context, domain.RepoName, int64) error); ok {
192
+
r0 = returnFunc(ctx, repo, number)
193
+
} else {
194
+
r0 = ret.Error(0)
195
+
}
196
+
return r0
197
+
}
198
+
199
+
// MergeRequestStore_DeleteMergeability_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteMergeability'
200
+
type MergeRequestStore_DeleteMergeability_Call struct {
201
+
*mock.Call
202
+
}
203
+
204
+
// DeleteMergeability is a helper method to define mock.On call
// NewMergeabilityReader creates a new instance of MergeabilityReader. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
15
+
// The first argument is typically a *testing.T value.
16
+
func NewMergeabilityReader(t interface {
17
+
mock.TestingT
18
+
Cleanup(func())
19
+
}) *MergeabilityReader {
20
+
if helper, ok := t.(interface{ Helper() }); ok {
21
+
helper.Helper()
22
+
}
23
+
24
+
mock := &MergeabilityReader{}
25
+
mock.Mock.Test(t)
26
+
27
+
t.Cleanup(func() {
28
+
if helper, ok := t.(interface{ Helper() }); ok {
29
+
helper.Helper()
30
+
}
31
+
mock.AssertExpectations(t)
32
+
})
33
+
34
+
return mock
35
+
}
36
+
37
+
// MergeabilityReader is an autogenerated mock type for the MergeabilityReader type
// NewMergeabilityReader creates a new instance of MergeabilityReader. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
15
+
// The first argument is typically a *testing.T value.
16
+
func NewMergeabilityReader(t interface {
17
+
mock.TestingT
18
+
Cleanup(func())
19
+
}) *MergeabilityReader {
20
+
if helper, ok := t.(interface{ Helper() }); ok {
21
+
helper.Helper()
22
+
}
23
+
24
+
mock := &MergeabilityReader{}
25
+
mock.Mock.Test(t)
26
+
27
+
t.Cleanup(func() {
28
+
if helper, ok := t.(interface{ Helper() }); ok {
29
+
helper.Helper()
30
+
}
31
+
mock.AssertExpectations(t)
32
+
})
33
+
34
+
return mock
35
+
}
36
+
37
+
// MergeabilityReader is an autogenerated mock type for the MergeabilityReader type
// NewMergeabilityTrigger creates a new instance of MergeabilityTrigger. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
15
+
// The first argument is typically a *testing.T value.
16
+
func NewMergeabilityTrigger(t interface {
17
+
mock.TestingT
18
+
Cleanup(func())
19
+
}) *MergeabilityTrigger {
20
+
if helper, ok := t.(interface{ Helper() }); ok {
21
+
helper.Helper()
22
+
}
23
+
24
+
mock := &MergeabilityTrigger{}
25
+
mock.Mock.Test(t)
26
+
27
+
t.Cleanup(func() {
28
+
if helper, ok := t.(interface{ Helper() }); ok {
29
+
helper.Helper()
30
+
}
31
+
mock.AssertExpectations(t)
32
+
})
33
+
34
+
return mock
35
+
}
36
+
37
+
// MergeabilityTrigger is an autogenerated mock type for the MergeabilityTrigger type
// NewMergeabilityTrigger creates a new instance of MergeabilityTrigger. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
15
+
// The first argument is typically a *testing.T value.
16
+
func NewMergeabilityTrigger(t interface {
17
+
mock.TestingT
18
+
Cleanup(func())
19
+
}) *MergeabilityTrigger {
20
+
if helper, ok := t.(interface{ Helper() }); ok {
21
+
helper.Helper()
22
+
}
23
+
24
+
mock := &MergeabilityTrigger{}
25
+
mock.Mock.Test(t)
26
+
27
+
t.Cleanup(func() {
28
+
if helper, ok := t.(interface{ Helper() }); ok {
29
+
helper.Helper()
30
+
}
31
+
mock.AssertExpectations(t)
32
+
})
33
+
34
+
return mock
35
+
}
36
+
37
+
// MergeabilityTrigger is an autogenerated mock type for the MergeabilityTrigger type