code.gitea.io/gitea@v1.21.7/models/pull/automerge.go (about) 1 // Copyright 2022 Gitea. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package pull 5 6 import ( 7 "context" 8 "fmt" 9 10 "code.gitea.io/gitea/models/db" 11 repo_model "code.gitea.io/gitea/models/repo" 12 user_model "code.gitea.io/gitea/models/user" 13 "code.gitea.io/gitea/modules/timeutil" 14 ) 15 16 // AutoMerge represents a pull request scheduled for merging when checks succeed 17 type AutoMerge struct { 18 ID int64 `xorm:"pk autoincr"` 19 PullID int64 `xorm:"UNIQUE"` 20 DoerID int64 `xorm:"NOT NULL"` 21 Doer *user_model.User `xorm:"-"` 22 MergeStyle repo_model.MergeStyle `xorm:"varchar(30)"` 23 Message string `xorm:"LONGTEXT"` 24 CreatedUnix timeutil.TimeStamp `xorm:"created"` 25 } 26 27 // TableName return database table name for xorm 28 func (AutoMerge) TableName() string { 29 return "pull_auto_merge" 30 } 31 32 func init() { 33 db.RegisterModel(new(AutoMerge)) 34 } 35 36 // ErrAlreadyScheduledToAutoMerge represents a "PullRequestHasMerged"-error 37 type ErrAlreadyScheduledToAutoMerge struct { 38 PullID int64 39 } 40 41 func (err ErrAlreadyScheduledToAutoMerge) Error() string { 42 return fmt.Sprintf("pull request is already scheduled to auto merge when checks succeed [pull_id: %d]", err.PullID) 43 } 44 45 // IsErrAlreadyScheduledToAutoMerge checks if an error is a ErrAlreadyScheduledToAutoMerge. 46 func IsErrAlreadyScheduledToAutoMerge(err error) bool { 47 _, ok := err.(ErrAlreadyScheduledToAutoMerge) 48 return ok 49 } 50 51 // ScheduleAutoMerge schedules a pull request to be merged when all checks succeed 52 func ScheduleAutoMerge(ctx context.Context, doer *user_model.User, pullID int64, style repo_model.MergeStyle, message string) error { 53 // Check if we already have a merge scheduled for that pull request 54 if exists, _, err := GetScheduledMergeByPullID(ctx, pullID); err != nil { 55 return err 56 } else if exists { 57 return ErrAlreadyScheduledToAutoMerge{PullID: pullID} 58 } 59 60 _, err := db.GetEngine(ctx).Insert(&AutoMerge{ 61 DoerID: doer.ID, 62 PullID: pullID, 63 MergeStyle: style, 64 Message: message, 65 }) 66 return err 67 } 68 69 // GetScheduledMergeByPullID gets a scheduled pull request merge by pull request id 70 func GetScheduledMergeByPullID(ctx context.Context, pullID int64) (bool, *AutoMerge, error) { 71 scheduledPRM := &AutoMerge{} 72 exists, err := db.GetEngine(ctx).Where("pull_id = ?", pullID).Get(scheduledPRM) 73 if err != nil || !exists { 74 return false, nil, err 75 } 76 77 doer, err := user_model.GetUserByID(ctx, scheduledPRM.DoerID) 78 if err != nil { 79 return false, nil, err 80 } 81 82 scheduledPRM.Doer = doer 83 return true, scheduledPRM, nil 84 } 85 86 // DeleteScheduledAutoMerge delete a scheduled pull request 87 func DeleteScheduledAutoMerge(ctx context.Context, pullID int64) error { 88 exist, scheduledPRM, err := GetScheduledMergeByPullID(ctx, pullID) 89 if err != nil { 90 return err 91 } else if !exist { 92 return db.ErrNotExist{Resource: "auto_merge", ID: pullID} 93 } 94 95 _, err = db.GetEngine(ctx).ID(scheduledPRM.ID).Delete(&AutoMerge{}) 96 return err 97 }