12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- // Copyright 2023 The Gitea Authors. All rights reserved.
- // SPDX-License-Identifier: MIT
-
- package actions
-
- import (
- "context"
- "fmt"
-
- actions_model "code.gitea.io/gitea/models/actions"
- "code.gitea.io/gitea/models/db"
- git_model "code.gitea.io/gitea/models/git"
- user_model "code.gitea.io/gitea/models/user"
- api "code.gitea.io/gitea/modules/structs"
- webhook_module "code.gitea.io/gitea/modules/webhook"
- )
-
- func CreateCommitStatus(ctx context.Context, job *actions_model.ActionRunJob) error {
- if err := job.LoadAttributes(ctx); err != nil {
- return fmt.Errorf("load run: %w", err)
- }
-
- run := job.Run
- if run.Event != webhook_module.HookEventPush {
- return nil
- }
-
- payload, err := run.GetPushEventPayload()
- if err != nil {
- return fmt.Errorf("GetPushEventPayload: %w", err)
- }
-
- creator, err := user_model.GetUserByID(ctx, payload.Pusher.ID)
- if err != nil {
- return fmt.Errorf("GetUserByID: %w", err)
- }
-
- repo := run.Repo
- sha := payload.HeadCommit.ID
- ctxname := job.Name
- state := toCommitStatus(job.Status)
-
- if statuses, _, err := git_model.GetLatestCommitStatus(ctx, repo.ID, sha, db.ListOptions{}); err == nil {
- for _, v := range statuses {
- if v.Context == ctxname {
- if v.State == state {
- return nil
- }
- break
- }
- }
- } else {
- return fmt.Errorf("GetLatestCommitStatus: %w", err)
- }
-
- if err := git_model.NewCommitStatus(ctx, git_model.NewCommitStatusOptions{
- Repo: repo,
- SHA: payload.HeadCommit.ID,
- Creator: creator,
- CommitStatus: &git_model.CommitStatus{
- SHA: sha,
- TargetURL: run.HTMLURL(),
- Description: "",
- Context: ctxname,
- CreatorID: payload.Pusher.ID,
- State: state,
- },
- }); err != nil {
- return fmt.Errorf("NewCommitStatus: %w", err)
- }
-
- return nil
- }
-
- func toCommitStatus(status actions_model.Status) api.CommitStatusState {
- switch status {
- case actions_model.StatusSuccess:
- return api.CommitStatusSuccess
- case actions_model.StatusFailure, actions_model.StatusCancelled, actions_model.StatusSkipped:
- return api.CommitStatusFailure
- case actions_model.StatusWaiting, actions_model.StatusBlocked:
- return api.CommitStatusPending
- case actions_model.StatusRunning:
- return api.CommitStatusRunning
- default:
- return api.CommitStatusError
- }
- }
|