06aae9ae72
Refs: https://codeberg.org/forgejo/forgejo/issues/1897 (cherry picked from commit ddc3c2255840d347afd13c272d2695c68196d6ef) (cherry picked from commit a7fe969b93ffe00aa66942d04e66ddb4221cb5ad) (cherry picked from commit 62bda95774ae0840652daf29f557b61650745ac1) (cherry picked from commit 8149a822c797eb6c9ea648757261c0aba8f8d548) (cherry picked from commit 9ed4e685ebd1a0c32d5550fd96f4f912fbd02c18) (cherry picked from commit 4f072b4f80d86e41004a107b56d74476e39d0536) (cherry picked from commit ca5924037b7d161e332709d01534d03e1c2bcf45) (cherry picked from commit 88e2b47e29285a761dc08a31288af3dd146ac63b) (cherry picked from commit 784f860cfa2d763e39551a84067a161db9ca3ddb)
98 lines
2.9 KiB
Go
98 lines
2.9 KiB
Go
// Copyright 2022 Gitea. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package pull
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"code.gitea.io/gitea/models/db"
|
|
repo_model "code.gitea.io/gitea/models/repo"
|
|
user_model "code.gitea.io/gitea/models/user"
|
|
"code.gitea.io/gitea/modules/timeutil"
|
|
)
|
|
|
|
// AutoMerge represents a pull request scheduled for merging when checks succeed
|
|
type AutoMerge struct {
|
|
ID int64 `xorm:"pk autoincr"`
|
|
PullID int64 `xorm:"UNIQUE"`
|
|
DoerID int64 `xorm:"INDEX NOT NULL"`
|
|
Doer *user_model.User `xorm:"-"`
|
|
MergeStyle repo_model.MergeStyle `xorm:"varchar(30)"`
|
|
Message string `xorm:"LONGTEXT"`
|
|
CreatedUnix timeutil.TimeStamp `xorm:"created"`
|
|
}
|
|
|
|
// TableName return database table name for xorm
|
|
func (AutoMerge) TableName() string {
|
|
return "pull_auto_merge"
|
|
}
|
|
|
|
func init() {
|
|
db.RegisterModel(new(AutoMerge))
|
|
}
|
|
|
|
// ErrAlreadyScheduledToAutoMerge represents a "PullRequestHasMerged"-error
|
|
type ErrAlreadyScheduledToAutoMerge struct {
|
|
PullID int64
|
|
}
|
|
|
|
func (err ErrAlreadyScheduledToAutoMerge) Error() string {
|
|
return fmt.Sprintf("pull request is already scheduled to auto merge when checks succeed [pull_id: %d]", err.PullID)
|
|
}
|
|
|
|
// IsErrAlreadyScheduledToAutoMerge checks if an error is a ErrAlreadyScheduledToAutoMerge.
|
|
func IsErrAlreadyScheduledToAutoMerge(err error) bool {
|
|
_, ok := err.(ErrAlreadyScheduledToAutoMerge)
|
|
return ok
|
|
}
|
|
|
|
// ScheduleAutoMerge schedules a pull request to be merged when all checks succeed
|
|
func ScheduleAutoMerge(ctx context.Context, doer *user_model.User, pullID int64, style repo_model.MergeStyle, message string) error {
|
|
// Check if we already have a merge scheduled for that pull request
|
|
if exists, _, err := GetScheduledMergeByPullID(ctx, pullID); err != nil {
|
|
return err
|
|
} else if exists {
|
|
return ErrAlreadyScheduledToAutoMerge{PullID: pullID}
|
|
}
|
|
|
|
_, err := db.GetEngine(ctx).Insert(&AutoMerge{
|
|
DoerID: doer.ID,
|
|
PullID: pullID,
|
|
MergeStyle: style,
|
|
Message: message,
|
|
})
|
|
return err
|
|
}
|
|
|
|
// GetScheduledMergeByPullID gets a scheduled pull request merge by pull request id
|
|
func GetScheduledMergeByPullID(ctx context.Context, pullID int64) (bool, *AutoMerge, error) {
|
|
scheduledPRM := &AutoMerge{}
|
|
exists, err := db.GetEngine(ctx).Where("pull_id = ?", pullID).Get(scheduledPRM)
|
|
if err != nil || !exists {
|
|
return false, nil, err
|
|
}
|
|
|
|
doer, err := user_model.GetPossibleUserByID(ctx, scheduledPRM.DoerID)
|
|
if err != nil {
|
|
return false, nil, err
|
|
}
|
|
|
|
scheduledPRM.Doer = doer
|
|
return true, scheduledPRM, nil
|
|
}
|
|
|
|
// DeleteScheduledAutoMerge delete a scheduled pull request
|
|
func DeleteScheduledAutoMerge(ctx context.Context, pullID int64) error {
|
|
exist, scheduledPRM, err := GetScheduledMergeByPullID(ctx, pullID)
|
|
if err != nil {
|
|
return err
|
|
} else if !exist {
|
|
return db.ErrNotExist{Resource: "auto_merge", ID: pullID}
|
|
}
|
|
|
|
_, err = db.GetEngine(ctx).ID(scheduledPRM.ID).Delete(&AutoMerge{})
|
|
return err
|
|
}
|