From ea01b5bbf0614dc569e5be9e883ea1f343c48fde Mon Sep 17 00:00:00 2001 From: sillyguodong Date: Tue, 7 Mar 2023 13:34:09 +0800 Subject: [PATCH 1/5] fix missing commit status in PR which from fork repo --- routers/web/repo/pull.go | 4 ++-- services/pull/pull.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go index 4f9968773824..8f3ab5f6f042 100644 --- a/routers/web/repo/pull.go +++ b/routers/web/repo/pull.go @@ -561,7 +561,7 @@ func PrepareViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *git.C return nil } - commitStatuses, _, err := git_model.GetLatestCommitStatus(ctx, repo.ID, sha, db.ListOptions{}) + commitStatuses, _, err := git_model.GetLatestCommitStatus(ctx, pull.HeadRepoID, sha, db.ListOptions{}) if err != nil { ctx.ServerError("GetLatestCommitStatus", err) return nil @@ -660,7 +660,7 @@ func ViewPullCommits(ctx *context.Context) { ctx.Data["Username"] = ctx.Repo.Owner.Name ctx.Data["Reponame"] = ctx.Repo.Repository.Name - commits := git_model.ConvertFromGitCommit(ctx, prInfo.Commits, ctx.Repo.Repository) + commits := git_model.ConvertFromGitCommit(ctx, prInfo.Commits, pull.HeadRepo) ctx.Data["Commits"] = commits ctx.Data["CommitCount"] = len(commits) diff --git a/services/pull/pull.go b/services/pull/pull.go index a19e88b33b65..39d76eed1974 100644 --- a/services/pull/pull.go +++ b/services/pull/pull.go @@ -778,7 +778,7 @@ func getAllCommitStatus(gitRepo *git.Repository, pr *issues_model.PullRequest) ( return nil, nil, shaErr } - statuses, _, err = git_model.GetLatestCommitStatus(db.DefaultContext, pr.BaseRepo.ID, sha, db.ListOptions{}) + statuses, _, err = git_model.GetLatestCommitStatus(db.DefaultContext, pr.HeadRepoID, sha, db.ListOptions{}) lastStatus = git_model.CalcCommitStatus(statuses) return statuses, lastStatus, err } From eb314bcecba938ae915fc39108900053f206ce78 Mon Sep 17 00:00:00 2001 From: sillyguodong Date: Wed, 8 Mar 2023 18:47:23 +0800 Subject: [PATCH 2/5] rollback --- routers/web/repo/pull.go | 4 ++-- services/pull/pull.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go index 8f3ab5f6f042..4f9968773824 100644 --- a/routers/web/repo/pull.go +++ b/routers/web/repo/pull.go @@ -561,7 +561,7 @@ func PrepareViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *git.C return nil } - commitStatuses, _, err := git_model.GetLatestCommitStatus(ctx, pull.HeadRepoID, sha, db.ListOptions{}) + commitStatuses, _, err := git_model.GetLatestCommitStatus(ctx, repo.ID, sha, db.ListOptions{}) if err != nil { ctx.ServerError("GetLatestCommitStatus", err) return nil @@ -660,7 +660,7 @@ func ViewPullCommits(ctx *context.Context) { ctx.Data["Username"] = ctx.Repo.Owner.Name ctx.Data["Reponame"] = ctx.Repo.Repository.Name - commits := git_model.ConvertFromGitCommit(ctx, prInfo.Commits, pull.HeadRepo) + commits := git_model.ConvertFromGitCommit(ctx, prInfo.Commits, ctx.Repo.Repository) ctx.Data["Commits"] = commits ctx.Data["CommitCount"] = len(commits) diff --git a/services/pull/pull.go b/services/pull/pull.go index 39d76eed1974..a19e88b33b65 100644 --- a/services/pull/pull.go +++ b/services/pull/pull.go @@ -778,7 +778,7 @@ func getAllCommitStatus(gitRepo *git.Repository, pr *issues_model.PullRequest) ( return nil, nil, shaErr } - statuses, _, err = git_model.GetLatestCommitStatus(db.DefaultContext, pr.HeadRepoID, sha, db.ListOptions{}) + statuses, _, err = git_model.GetLatestCommitStatus(db.DefaultContext, pr.BaseRepo.ID, sha, db.ListOptions{}) lastStatus = git_model.CalcCommitStatus(statuses) return statuses, lastStatus, err } From b9be88f63ab2e1732002eb577a3f0a3f714f55d5 Mon Sep 17 00:00:00 2001 From: sillyguodong Date: Wed, 8 Mar 2023 23:41:34 +0800 Subject: [PATCH 3/5] create commit status when the type of event is pull request --- models/actions/run.go | 11 ++++++ services/actions/commit_status.go | 61 ++++++++++++++++++++----------- 2 files changed, 51 insertions(+), 21 deletions(-) diff --git a/models/actions/run.go b/models/actions/run.go index d5ab45a51958..a711cfee2ecd 100644 --- a/models/actions/run.go +++ b/models/actions/run.go @@ -128,6 +128,17 @@ func (run *ActionRun) GetPushEventPayload() (*api.PushPayload, error) { return nil, fmt.Errorf("event %s is not a push event", run.Event) } +func (run *ActionRun) GetPullRequestEventPayload() (*api.PullRequestPayload, error) { + if run.Event == webhook_module.HookEventPullRequest { + var payload api.PullRequestPayload + if err := json.Unmarshal([]byte(run.EventPayload), &payload); err != nil { + return nil, err + } + return &payload, nil + } + return nil, fmt.Errorf("event %s is not a pull request event", run.Event) +} + func updateRepoRunsNumbers(ctx context.Context, repo *repo_model.Repository) error { _, err := db.GetEngine(ctx).ID(repo.ID). SetExpr("num_action_runs", diff --git a/services/actions/commit_status.go b/services/actions/commit_status.go index 4f313493523e..be56e49662b7 100644 --- a/services/actions/commit_status.go +++ b/services/actions/commit_status.go @@ -21,35 +21,54 @@ func CreateCommitStatus(ctx context.Context, job *actions_model.ActionRunJob) er } run := job.Run - if run.Event != webhook_module.HookEventPush { + if run.Event != webhook_module.HookEventPush && run.Event != webhook_module.HookEventPullRequest { return nil } + var ( + sha string + creatorID int64 + ) - payload, err := run.GetPushEventPayload() - if err != nil { - return fmt.Errorf("GetPushEventPayload: %w", err) - } + if run.Event == 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 + } else { + payload, err := run.GetPullRequestEventPayload() + if err != nil { + return fmt.Errorf("GetPullRequestEventPayload: %w", err) + } + // TODO: check json + switch { + case payload.PullRequest == nil: + return fmt.Errorf("pull request is missing in event payload") + } + + sha = payload.PullRequest.Head.Sha + creatorID = payload.PullRequest.Head.Repository.Owner.ID } 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 +84,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 { From 983ec5e1fa2bc0ffe9fc95c4bc002a0f73c44fa0 Mon Sep 17 00:00:00 2001 From: sillyguodong Date: Thu, 9 Mar 2023 10:39:52 +0800 Subject: [PATCH 4/5] add the icon which represents running in PRs list --- templates/repo/commit_status.tmpl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/templates/repo/commit_status.tmpl b/templates/repo/commit_status.tmpl index fbf064527da4..470869b381c0 100644 --- a/templates/repo/commit_status.tmpl +++ b/templates/repo/commit_status.tmpl @@ -1,6 +1,9 @@ {{if eq .State "pending"}} {{svg "octicon-dot-fill" 18 "commit-status icon text yellow"}} {{end}} +{{if eq .State "running"}} + {{svg "octicon-dot-fill" 18 "commit-status icon text yellow"}} +{{end}} {{if eq .State "success"}} {{svg "octicon-check" 18 "commit-status icon text green"}} {{end}} From e6804e1237adcdd19869f28e3c3616c8e2288076 Mon Sep 17 00:00:00 2001 From: sillyguodong Date: Thu, 9 Mar 2023 14:35:51 +0800 Subject: [PATCH 5/5] use switch --- services/actions/commit_status.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/services/actions/commit_status.go b/services/actions/commit_status.go index be56e49662b7..84de106eeca3 100644 --- a/services/actions/commit_status.go +++ b/services/actions/commit_status.go @@ -21,15 +21,13 @@ func CreateCommitStatus(ctx context.Context, job *actions_model.ActionRunJob) er } run := job.Run - if run.Event != webhook_module.HookEventPush && run.Event != webhook_module.HookEventPullRequest { - return nil - } var ( sha string creatorID int64 ) - if run.Event == webhook_module.HookEventPush { + switch run.Event { + case webhook_module.HookEventPush: payload, err := run.GetPushEventPayload() if err != nil { return fmt.Errorf("GetPushEventPayload: %w", err) @@ -47,19 +45,27 @@ func CreateCommitStatus(ctx context.Context, job *actions_model.ActionRunJob) er sha = payload.HeadCommit.ID creatorID = payload.Pusher.ID - } else { + case webhook_module.HookEventPullRequest: payload, err := run.GetPullRequestEventPayload() if err != nil { return fmt.Errorf("GetPullRequestEventPayload: %w", err) } - // TODO: check json + 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