You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

commit_status.go 2.2KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // Copyright 2023 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package actions
  4. import (
  5. "context"
  6. "fmt"
  7. actions_model "code.gitea.io/gitea/models/actions"
  8. "code.gitea.io/gitea/models/db"
  9. git_model "code.gitea.io/gitea/models/git"
  10. user_model "code.gitea.io/gitea/models/user"
  11. api "code.gitea.io/gitea/modules/structs"
  12. webhook_module "code.gitea.io/gitea/modules/webhook"
  13. )
  14. func CreateCommitStatus(ctx context.Context, job *actions_model.ActionRunJob) error {
  15. if err := job.LoadAttributes(ctx); err != nil {
  16. return fmt.Errorf("load run: %w", err)
  17. }
  18. run := job.Run
  19. if run.Event != webhook_module.HookEventPush {
  20. return nil
  21. }
  22. payload, err := run.GetPushEventPayload()
  23. if err != nil {
  24. return fmt.Errorf("GetPushEventPayload: %w", err)
  25. }
  26. creator, err := user_model.GetUserByID(ctx, payload.Pusher.ID)
  27. if err != nil {
  28. return fmt.Errorf("GetUserByID: %w", err)
  29. }
  30. repo := run.Repo
  31. sha := payload.HeadCommit.ID
  32. ctxname := job.Name
  33. state := toCommitStatus(job.Status)
  34. if statuses, _, err := git_model.GetLatestCommitStatus(ctx, repo.ID, sha, db.ListOptions{}); err == nil {
  35. for _, v := range statuses {
  36. if v.Context == ctxname {
  37. if v.State == state {
  38. return nil
  39. }
  40. break
  41. }
  42. }
  43. } else {
  44. return fmt.Errorf("GetLatestCommitStatus: %w", err)
  45. }
  46. if err := git_model.NewCommitStatus(ctx, git_model.NewCommitStatusOptions{
  47. Repo: repo,
  48. SHA: payload.HeadCommit.ID,
  49. Creator: creator,
  50. CommitStatus: &git_model.CommitStatus{
  51. SHA: sha,
  52. TargetURL: run.HTMLURL(),
  53. Description: "",
  54. Context: ctxname,
  55. CreatorID: payload.Pusher.ID,
  56. State: state,
  57. },
  58. }); err != nil {
  59. return fmt.Errorf("NewCommitStatus: %w", err)
  60. }
  61. return nil
  62. }
  63. func toCommitStatus(status actions_model.Status) api.CommitStatusState {
  64. switch status {
  65. case actions_model.StatusSuccess:
  66. return api.CommitStatusSuccess
  67. case actions_model.StatusFailure, actions_model.StatusCancelled, actions_model.StatusSkipped:
  68. return api.CommitStatusFailure
  69. case actions_model.StatusWaiting, actions_model.StatusBlocked:
  70. return api.CommitStatusPending
  71. case actions_model.StatusRunning:
  72. return api.CommitStatusRunning
  73. default:
  74. return api.CommitStatusError
  75. }
  76. }