aboutsummaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorsillyguodong <33891828+sillyguodong@users.noreply.github.com>2023-03-14 05:05:19 +0800
committerGitHub <noreply@github.com>2023-03-13 16:05:19 -0500
commit5eea61dbc8f8e82e0dd05addf76751ee517459a0 (patch)
tree3254e7a65fe94e70deed722aa91c3696fe28a8ff /services
parentc709fa17a77eae391cafbe72d6b2594f74d86a60 (diff)
downloadgitea-5eea61dbc8f8e82e0dd05addf76751ee517459a0.tar.gz
gitea-5eea61dbc8f8e82e0dd05addf76751ee517459a0.zip
Fix missing commit status in PR which from forked repo (#23351)
close: #23347 ### Reference and Inference According to Github REST API [doc](https://docs.github.com/en/rest/commits/statuses?apiVersion=2022-11-28#list-commit-statuses-for-a-reference): 1. The `Drone CI` that can create some commit status by [API](https://docs.github.com/en/rest/commits/statuses?apiVersion=2022-11-28#create-a-commit-status) is enabled in `go-gitea/gitea`. So I tried to call the API to get a commit status list of a PR which is commited to upstream repo(`go-gitea/gitea`). As a result, the API returned a array of commit status. ![image](https://user-images.githubusercontent.com/33891828/223913371-313d047a-5e2e-484c-b13e-dcd38748703e.png) 2. Then I tried to call the API to get commit status list of the reference which of the `SHA` is the same as step 1 in the repo which is forked from `go-gitea/gitea`. But I got a empty array. ![image](https://user-images.githubusercontent.com/33891828/223930827-17a64d3c-f466-4980-897c-77fe386c4d3b.png) So, I believe it that: 1. The commit status is not shared between upstream repo and forked repo. 2. The coomit status is bound to a repo that performs actions. (Gitea's logic is the same) ### Cause During debugging, I found it that commit status are not stored in the DB as expected. So, I located the following code: https://github.com/go-gitea/gitea/blob/8cadd51bf295e6ff36ac36efed68cc5de34c9382/services/actions/commit_status.go#L18-L26 When I create a PR, the type of `event` is `pull request`, not `push`. So the code return function directly. ### Screenshot ![image](https://user-images.githubusercontent.com/33891828/223939339-dadf539c-1fdd-40c4-96e9-2e4fa733f531.png) ![image](https://user-images.githubusercontent.com/33891828/223939519-edb02bf0-2478-4ea5-9366-be85468f02db.png) ![image](https://user-images.githubusercontent.com/33891828/223939557-ec6f1375-5536-400e-8987-fb7d2fd452fa.png) ### Other In this PR, I also fix the problem of missing icon which represents running in PRs list. ![image](https://user-images.githubusercontent.com/33891828/223939898-2a0339e4-713f-4c7b-9d99-2250a43f3457.png) ![image](https://user-images.githubusercontent.com/33891828/223939979-037a975f-5ced-480c-bac7-0ee00ebfff4b.png)
Diffstat (limited to 'services')
-rw-r--r--services/actions/commit_status.go71
1 files changed, 48 insertions, 23 deletions
diff --git a/services/actions/commit_status.go b/services/actions/commit_status.go
index 4f31349352..84de106eec 100644
--- a/services/actions/commit_status.go
+++ b/services/actions/commit_status.go
@@ -21,35 +21,60 @@ func CreateCommitStatus(ctx context.Context, job *actions_model.ActionRunJob) er
}
run := job.Run
- if run.Event != webhook_module.HookEventPush {
- return nil
- }
+ var (
+ sha string
+ creatorID int64
+ )
- payload, err := run.GetPushEventPayload()
- if err != nil {
- return fmt.Errorf("GetPushEventPayload: %w", err)
- }
+ switch run.Event {
+ case webhook_module.HookEventPush:
+ payload, err := run.GetPushEventPayload()
+ if err != nil {
+ return fmt.Errorf("GetPushEventPayload: %w", err)
+ }
- // Since the payload comes from json data, we should check if it's broken, or it will cause panic
- switch {
- case payload.Repo == nil:
- return fmt.Errorf("repo is missing in event payload")
- case payload.Pusher == nil:
- return fmt.Errorf("pusher is missing in event payload")
- case payload.HeadCommit == nil:
- return fmt.Errorf("head commit is missing in event payload")
- }
+ // Since the payload comes from json data, we should check if it's broken, or it will cause panic
+ switch {
+ case payload.Repo == nil:
+ return fmt.Errorf("repo is missing in event payload")
+ case payload.Pusher == nil:
+ return fmt.Errorf("pusher is missing in event payload")
+ case payload.HeadCommit == nil:
+ return fmt.Errorf("head commit is missing in event payload")
+ }
- creator, err := user_model.GetUserByID(ctx, payload.Pusher.ID)
- if err != nil {
- return fmt.Errorf("GetUserByID: %w", err)
+ sha = payload.HeadCommit.ID
+ creatorID = payload.Pusher.ID
+ case webhook_module.HookEventPullRequest:
+ payload, err := run.GetPullRequestEventPayload()
+ if err != nil {
+ return fmt.Errorf("GetPullRequestEventPayload: %w", err)
+ }
+
+ switch {
+ case payload.PullRequest == nil:
+ return fmt.Errorf("pull request is missing in event payload")
+ case payload.PullRequest.Head == nil:
+ return fmt.Errorf("head of pull request is missing in event payload")
+ case payload.PullRequest.Head.Repository == nil:
+ return fmt.Errorf("head repository of pull request is missing in event payload")
+ case payload.PullRequest.Head.Repository.Owner == nil:
+ return fmt.Errorf("owner of head repository of pull request is missing in evnt payload")
+ }
+
+ sha = payload.PullRequest.Head.Sha
+ creatorID = payload.PullRequest.Head.Repository.Owner.ID
+ default:
+ return nil
}
repo := run.Repo
- sha := payload.HeadCommit.ID
ctxname := job.Name
state := toCommitStatus(job.Status)
-
+ creator, err := user_model.GetUserByID(ctx, creatorID)
+ if err != nil {
+ return fmt.Errorf("GetUserByID: %w", err)
+ }
if statuses, _, err := git_model.GetLatestCommitStatus(ctx, repo.ID, sha, db.ListOptions{}); err == nil {
for _, v := range statuses {
if v.Context == ctxname {
@@ -65,14 +90,14 @@ func CreateCommitStatus(ctx context.Context, job *actions_model.ActionRunJob) er
if err := git_model.NewCommitStatus(ctx, git_model.NewCommitStatusOptions{
Repo: repo,
- SHA: payload.HeadCommit.ID,
+ SHA: sha,
Creator: creator,
CommitStatus: &git_model.CommitStatus{
SHA: sha,
TargetURL: run.Link(),
Description: "",
Context: ctxname,
- CreatorID: payload.Pusher.ID,
+ CreatorID: creatorID,
State: state,
},
}); err != nil {