mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-31 11:28:24 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			89 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // 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"
 | |
| 	webhook_model "code.gitea.io/gitea/models/webhook"
 | |
| 	api "code.gitea.io/gitea/modules/structs"
 | |
| )
 | |
| 
 | |
| 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_model.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(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
 | |
| 	}
 | |
| }
 |