gitea源码

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