Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

commit_status_summary.go 2.5KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // Copyright 2024 Gitea. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package git
  4. import (
  5. "context"
  6. "code.gitea.io/gitea/models/db"
  7. "code.gitea.io/gitea/modules/setting"
  8. api "code.gitea.io/gitea/modules/structs"
  9. "xorm.io/builder"
  10. )
  11. // CommitStatusSummary holds the latest commit Status of a single Commit
  12. type CommitStatusSummary struct {
  13. ID int64 `xorm:"pk autoincr"`
  14. RepoID int64 `xorm:"INDEX UNIQUE(repo_id_sha)"`
  15. SHA string `xorm:"VARCHAR(64) NOT NULL INDEX UNIQUE(repo_id_sha)"`
  16. State api.CommitStatusState `xorm:"VARCHAR(7) NOT NULL"`
  17. TargetURL string `xorm:"TEXT"`
  18. }
  19. func init() {
  20. db.RegisterModel(new(CommitStatusSummary))
  21. }
  22. type RepoSHA struct {
  23. RepoID int64
  24. SHA string
  25. }
  26. func GetLatestCommitStatusForRepoAndSHAs(ctx context.Context, repoSHAs []RepoSHA) ([]*CommitStatus, error) {
  27. cond := builder.NewCond()
  28. for _, rs := range repoSHAs {
  29. cond = cond.Or(builder.Eq{"repo_id": rs.RepoID, "sha": rs.SHA})
  30. }
  31. var summaries []CommitStatusSummary
  32. if err := db.GetEngine(ctx).Where(cond).Find(&summaries); err != nil {
  33. return nil, err
  34. }
  35. commitStatuses := make([]*CommitStatus, 0, len(repoSHAs))
  36. for _, summary := range summaries {
  37. commitStatuses = append(commitStatuses, &CommitStatus{
  38. RepoID: summary.RepoID,
  39. SHA: summary.SHA,
  40. State: summary.State,
  41. TargetURL: summary.TargetURL,
  42. })
  43. }
  44. return commitStatuses, nil
  45. }
  46. func UpdateCommitStatusSummary(ctx context.Context, repoID int64, sha string) error {
  47. commitStatuses, _, err := GetLatestCommitStatus(ctx, repoID, sha, db.ListOptionsAll)
  48. if err != nil {
  49. return err
  50. }
  51. state := CalcCommitStatus(commitStatuses)
  52. // mysql will return 0 when update a record which state hasn't been changed which behaviour is different from other database,
  53. // so we need to use insert in on duplicate
  54. if setting.Database.Type.IsMySQL() {
  55. _, err := db.GetEngine(ctx).Exec("INSERT INTO commit_status_summary (repo_id,sha,state,target_url) VALUES (?,?,?,?) ON DUPLICATE KEY UPDATE state=?",
  56. repoID, sha, state.State, state.TargetURL, state.State)
  57. return err
  58. }
  59. if cnt, err := db.GetEngine(ctx).Where("repo_id=? AND sha=?", repoID, sha).
  60. Cols("state, target_url").
  61. Update(&CommitStatusSummary{
  62. State: state.State,
  63. TargetURL: state.TargetURL,
  64. }); err != nil {
  65. return err
  66. } else if cnt == 0 {
  67. _, err = db.GetEngine(ctx).Insert(&CommitStatusSummary{
  68. RepoID: repoID,
  69. SHA: sha,
  70. State: state.State,
  71. TargetURL: state.TargetURL,
  72. })
  73. return err
  74. }
  75. return nil
  76. }