Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix incompleted commit status events #32879

Draft
wants to merge 2 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions modules/structs/hook.go
Original file line number Diff line number Diff line change
Expand Up @@ -509,14 +509,14 @@ type CommitStatusPayload struct {
Commit *PayloadCommit `json:"commit"`
Context string `json:"context"`
// swagger:strfmt date-time
CreatedAt time.Time `json:"created_at"`
Description string `json:"description"`
ID int64 `json:"id"`
Repo *Repository `json:"repository"`
Sender *User `json:"sender"`
SHA string `json:"sha"`
State string `json:"state"`
TargetURL string `json:"target_url"`
CreatedAt time.Time `json:"created_at"`
Description string `json:"description"`
ID int64 `json:"id"`
Repo *Repository `json:"repository"`
Sender *User `json:"sender"`
SHA string `json:"sha"`
State CommitStatusState `json:"state"`
TargetURL string `json:"target_url"`
// swagger:strfmt date-time
UpdatedAt *time.Time `json:"updated_at"`
}
Expand Down
1 change: 1 addition & 0 deletions modules/webhook/structs.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ type HookEvents struct {
Repository bool `json:"repository"`
Release bool `json:"release"`
Package bool `json:"package"`
CommitStatus bool `json:"commit_status"`
}

// HookEvent represents events that will delivery hook.
Expand Down
2 changes: 2 additions & 0 deletions options/locale/locale_en-US.ini
Original file line number Diff line number Diff line change
Expand Up @@ -2362,6 +2362,8 @@ settings.event_pull_request_approvals = Pull Request Approvals
settings.event_pull_request_merge = Pull Request Merge
settings.event_package = Package
settings.event_package_desc = Package created or deleted in a repository.
settings.event_commitstatus = Commit Status
settings.event_commitstatus_desc = Commit status updated.
settings.branch_filter = Branch filter
settings.branch_filter_desc = Branch whitelist for push, branch creation and branch deletion events, specified as glob pattern. If empty or <code>*</code>, events for all branches are reported. See <a href="%[1]s">%[2]s</a> documentation for syntax. Examples: <code>master</code>, <code>{master,release*}</code>.
settings.authorization_header = Authorization Header
Expand Down
1 change: 1 addition & 0 deletions routers/web/repo/setting/webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,7 @@ func ParseHookEvent(form forms.WebhookForm) *webhook_module.HookEvent {
Wiki: form.Wiki,
Repository: form.Repository,
Package: form.Package,
CommitStatus: form.CommitStatus,
},
BranchFilter: form.BranchFilter,
}
Expand Down
1 change: 1 addition & 0 deletions services/forms/repo_form.go
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,7 @@ type WebhookForm struct {
Wiki bool
Repository bool
Package bool
CommitStatus bool
Active bool
BranchFilter string `binding:"GlobPattern"`
AuthorizationHeader string
Expand Down
6 changes: 6 additions & 0 deletions services/webhook/dingtalk.go
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,12 @@ func (dc dingtalkConvertor) Package(p *api.PackagePayload) (DingtalkPayload, err
return createDingtalkPayload(text, text, "view package", p.Package.HTMLURL), nil
}

func (dc dingtalkConvertor) CommitStatus(p *api.CommitStatusPayload) (DingtalkPayload, error) {
text, _ := getCommitStatusPayloadInfo(p, noneLinkFormatter, true)

return createDingtalkPayload(text, text, "view commit status", p.TargetURL), nil
}

func createDingtalkPayload(title, text, singleTitle, singleURL string) DingtalkPayload {
return DingtalkPayload{
MsgType: "actionCard",
Expand Down
6 changes: 6 additions & 0 deletions services/webhook/discord.go
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,12 @@ func (d discordConvertor) Package(p *api.PackagePayload) (DiscordPayload, error)
return d.createPayload(p.Sender, text, "", p.Package.HTMLURL, color), nil
}

func (d discordConvertor) CommitStatus(p *api.CommitStatusPayload) (DiscordPayload, error) {
text, color := getCommitStatusPayloadInfo(p, noneLinkFormatter, true)

return d.createPayload(p.Sender, "view commit status", text, p.TargetURL, color), nil
}

func newDiscordRequest(_ context.Context, w *webhook_model.Webhook, t *webhook_model.HookTask) (*http.Request, []byte, error) {
meta := &DiscordMeta{}
if err := json.Unmarshal([]byte(w.Meta), meta); err != nil {
Expand Down
6 changes: 6 additions & 0 deletions services/webhook/feishu.go
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,12 @@ func (fc feishuConvertor) Package(p *api.PackagePayload) (FeishuPayload, error)
return newFeishuTextPayload(text), nil
}

func (fc feishuConvertor) CommitStatus(p *api.CommitStatusPayload) (FeishuPayload, error) {
text, _ := getCommitStatusPayloadInfo(p, markdownFormatter, true)

return newFeishuTextPayload(text), nil
}

func newFeishuRequest(_ context.Context, w *webhook_model.Webhook, t *webhook_model.HookTask) (*http.Request, []byte, error) {
var pc payloadConvertor[FeishuPayload] = feishuConvertor{}
return newJSONRequest(pc, w, t, true)
Expand Down
22 changes: 22 additions & 0 deletions services/webhook/general.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ func htmlLinkFormatter(url, text string) string {
return fmt.Sprintf(`<a href="%s">%s</a>`, html.EscapeString(url), html.EscapeString(text))
}

func markdownFormatter(url, text string) string {
return fmt.Sprintf("[%s](%s)", text, url)
}

// getPullRequestInfo gets the information for a pull request
func getPullRequestInfo(p *api.PullRequestPayload) (title, link, by, operator, operateResult, assignees string) {
title = fmt.Sprintf("[PullRequest-%s #%d]: %s\n%s", p.Repository.FullName, p.PullRequest.Index, p.Action, p.PullRequest.Title)
Expand Down Expand Up @@ -307,6 +311,24 @@ func getPackagePayloadInfo(p *api.PackagePayload, linkFormatter linkFormatter, w
return text, color
}

func getCommitStatusPayloadInfo(p *api.CommitStatusPayload, linkFormatter linkFormatter, _ bool) (string, int) {
refLink := linkFormatter(p.Commit.URL, p.Commit.ID[:10])
var color int
switch p.State {
case api.CommitStatusSuccess:
color = greenColor
case api.CommitStatusPending:
color = greyColor
case api.CommitStatusWarning:
color = yellowColor
default:
color = redColor
}

repoLink := linkFormatter(p.Repo.HTMLURL, p.Repo.FullName)
return fmt.Sprintf("%s Commit %s status changed to %s", repoLink, refLink, p.State.String()), color
}

// ToHook convert models.Webhook to api.Hook
// This function is not part of the convert package to prevent an import cycle
func ToHook(repoLink string, w *webhook_model.Webhook) (*api.Hook, error) {
Expand Down
6 changes: 6 additions & 0 deletions services/webhook/matrix.go
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,12 @@ func (m matrixConvertor) Package(p *api.PackagePayload) (MatrixPayload, error) {
return m.newPayload(text)
}

func (m matrixConvertor) CommitStatus(p *api.CommitStatusPayload) (MatrixPayload, error) {
text, _ := getCommitStatusPayloadInfo(p, noneLinkFormatter, true)

return m.newPayload(text)
}

var urlRegex = regexp.MustCompile(`<a [^>]*?href="([^">]*?)">(.*?)</a>`)

func getMessageBody(htmlText string) string {
Expand Down
14 changes: 14 additions & 0 deletions services/webhook/msteams.go
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,20 @@ func (m msteamsConvertor) Package(p *api.PackagePayload) (MSTeamsPayload, error)
), nil
}

func (m msteamsConvertor) CommitStatus(p *api.CommitStatusPayload) (MSTeamsPayload, error) {
text, color := getCommitStatusPayloadInfo(p, noneLinkFormatter, true)

return createMSTeamsPayload(
p.Repo,
p.Sender,
text,
"",
p.Commit.URL,
color,
&MSTeamsFact{"CommitStatus:", p.Commit.ID},
), nil
}

func createMSTeamsPayload(r *api.Repository, s *api.User, title, text, actionTarget string, color int, fact *MSTeamsFact) MSTeamsPayload {
facts := make([]MSTeamsFact, 0, 2)
if r != nil {
Expand Down
2 changes: 1 addition & 1 deletion services/webhook/notifier.go
Original file line number Diff line number Diff line change
Expand Up @@ -880,7 +880,7 @@ func (m *webhookNotifier) CreateCommitStatus(ctx context.Context, repo *repo_mod
Description: status.Description,
ID: status.ID,
SHA: commit.Sha1,
State: status.State.String(),
State: status.State,
TargetURL: status.TargetURL,

Commit: apiCommit,
Expand Down
4 changes: 4 additions & 0 deletions services/webhook/packagist.go
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,10 @@ func (pc packagistConvertor) Package(_ *api.PackagePayload) (PackagistPayload, e
return PackagistPayload{}, nil
}

func (pc packagistConvertor) CommitStatus(p *api.CommitStatusPayload) (PackagistPayload, error) {
return PackagistPayload{}, nil
}

func newPackagistRequest(_ context.Context, w *webhook_model.Webhook, t *webhook_model.HookTask) (*http.Request, []byte, error) {
meta := &PackagistMeta{}
if err := json.Unmarshal([]byte(w.Meta), meta); err != nil {
Expand Down
3 changes: 3 additions & 0 deletions services/webhook/payloader.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ type payloadConvertor[T any] interface {
Release(*api.ReleasePayload) (T, error)
Wiki(*api.WikiPayload) (T, error)
Package(*api.PackagePayload) (T, error)
CommitStatus(*api.CommitStatusPayload) (T, error)
}

func convertUnmarshalledJSON[T, P any](convert func(P) (T, error), data []byte) (t T, err error) {
Expand Down Expand Up @@ -77,6 +78,8 @@ func newPayload[T any](rc payloadConvertor[T], data []byte, event webhook_module
return convertUnmarshalledJSON(rc.Wiki, data)
case webhook_module.HookEventPackage:
return convertUnmarshalledJSON(rc.Package, data)
case webhook_module.HookEventStatus:
return convertUnmarshalledJSON(rc.CommitStatus, data)
}
return t, fmt.Errorf("newPayload unsupported event: %s", event)
}
Expand Down
6 changes: 6 additions & 0 deletions services/webhook/slack.go
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,12 @@ func (s slackConvertor) Repository(p *api.RepositoryPayload) (SlackPayload, erro
return s.createPayload(text, nil), nil
}

func (s slackConvertor) CommitStatus(p *api.CommitStatusPayload) (SlackPayload, error) {
text, _ := getCommitStatusPayloadInfo(p, noneLinkFormatter, true)

return s.createPayload(text, nil), nil
}

func (s slackConvertor) createPayload(text string, attachments []SlackAttachment) SlackPayload {
return SlackPayload{
Channel: s.Channel,
Expand Down
6 changes: 6 additions & 0 deletions services/webhook/telegram.go
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,12 @@ func (t telegramConvertor) Package(p *api.PackagePayload) (TelegramPayload, erro
return createTelegramPayloadHTML(text), nil
}

func (t telegramConvertor) CommitStatus(p *api.CommitStatusPayload) (TelegramPayload, error) {
text, _ := getCommitStatusPayloadInfo(p, noneLinkFormatter, true)

return createTelegramPayloadHTML(text), nil
}

func createTelegramPayloadHTML(msgHTML string) TelegramPayload {
// https://core.telegram.org/bots/api#formatting-options
return TelegramPayload{
Expand Down
6 changes: 6 additions & 0 deletions services/webhook/wechatwork.go
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,12 @@ func (wc wechatworkConvertor) Package(p *api.PackagePayload) (WechatworkPayload,
return newWechatworkMarkdownPayload(text), nil
}

func (wc wechatworkConvertor) CommitStatus(p *api.CommitStatusPayload) (WechatworkPayload, error) {
text, _ := getCommitStatusPayloadInfo(p, noneLinkFormatter, true)

return newWechatworkMarkdownPayload(text), nil
}

func newWechatworkRequest(_ context.Context, w *webhook_model.Webhook, t *webhook_model.HookTask) (*http.Request, []byte, error) {
var pc payloadConvertor[WechatworkPayload] = wechatworkConvertor{}
return newJSONRequest(pc, w, t, true)
Expand Down
11 changes: 11 additions & 0 deletions templates/repo/settings/webhook/settings.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,17 @@
</div>
</div>

<!-- CommitStatus -->
<div class="seven wide column">
<div class="field">
<div class="ui checkbox">
<input name="commit_status" type="checkbox" {{if .Webhook.CommitStatus}}checked{{end}}>
<label>{{ctx.Locale.Tr "repo.settings.event_commitstatus"}}</label>
<span class="help">{{ctx.Locale.Tr "repo.settings.event_commitstatus_desc"}}</span>
</div>
</div>
</div>

<!-- Issue Events -->
<div class="fourteen wide column">
<label>{{ctx.Locale.Tr "repo.settings.event_header_issue"}}</label>
Expand Down
Loading