]> source.dussan.org Git - gitea.git/commitdiff
Truncate commit message during Discord webhook push events (#31970)
authorKemal Zebari <60799661+kemzeb@users.noreply.github.com>
Tue, 24 Sep 2024 03:38:08 +0000 (20:38 -0700)
committerGitHub <noreply@github.com>
Tue, 24 Sep 2024 03:38:08 +0000 (03:38 +0000)
Resolves #31668.

services/webhook/discord.go
services/webhook/discord_test.go
services/webhook/general_test.go

index f27b39dac371617a7bc318944612a9a18cb449fb..59e87a7e1fb67ab558a0838ed2e702a89dfc6a4f 100644 (file)
@@ -11,6 +11,7 @@ import (
        "net/url"
        "strconv"
        "strings"
+       "unicode/utf8"
 
        webhook_model "code.gitea.io/gitea/models/webhook"
        "code.gitea.io/gitea/modules/git"
@@ -154,8 +155,14 @@ func (d discordConvertor) Push(p *api.PushPayload) (DiscordPayload, error) {
        var text string
        // for each commit, generate attachment text
        for i, commit := range p.Commits {
-               text += fmt.Sprintf("[%s](%s) %s - %s", commit.ID[:7], commit.URL,
-                       strings.TrimRight(commit.Message, "\r\n"), commit.Author.Name)
+               // limit the commit message display to just the summary, otherwise it would be hard to read
+               message := strings.TrimRight(strings.SplitN(commit.Message, "\n", 1)[0], "\r")
+
+               // a limit of 50 is set because GitHub does the same
+               if utf8.RuneCountInString(message) > 50 {
+                       message = fmt.Sprintf("%.47s...", message)
+               }
+               text += fmt.Sprintf("[%s](%s) %s - %s", commit.ID[:7], commit.URL, message, commit.Author.Name)
                // add linebreak to each commit but the last
                if i < len(p.Commits)-1 {
                        text += "\n"
index c04b95383bf1311c57c9a7d34af94bf1e28799d7..fbb4b24ef12dda3ba28e9e8acd74a642cba98fbe 100644 (file)
@@ -80,6 +80,20 @@ func TestDiscordPayload(t *testing.T) {
                assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL)
        })
 
+       t.Run("PushWithLongCommitMessage", func(t *testing.T) {
+               p := pushTestMultilineCommitMessagePayload()
+
+               pl, err := dc.Push(p)
+               require.NoError(t, err)
+
+               assert.Len(t, pl.Embeds, 1)
+               assert.Equal(t, "[test/repo:test] 2 new commits", pl.Embeds[0].Title)
+               assert.Equal(t, "[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) This is a commit summary ⚠️⚠️⚠️⚠️ containing 你好... - user1\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) This is a commit summary ⚠️⚠️⚠️⚠️ containing 你好... - user1", pl.Embeds[0].Description)
+               assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name)
+               assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL)
+               assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL)
+       })
+
        t.Run("Issue", func(t *testing.T) {
                p := issueTestPayload()
 
index fc6e7140e7be0a099c24cdd59a162bec1f756ea4..d6a77c94425604d39f8b9b11f417a7dcf7445d12 100644 (file)
@@ -64,9 +64,17 @@ func forkTestPayload() *api.ForkPayload {
 }
 
 func pushTestPayload() *api.PushPayload {
+       return pushTestPayloadWithCommitMessage("commit message")
+}
+
+func pushTestMultilineCommitMessagePayload() *api.PushPayload {
+       return pushTestPayloadWithCommitMessage("This is a commit summary ⚠️⚠️⚠️⚠️ containing 你好 ⚠️⚠️️\n\nThis is the message body.")
+}
+
+func pushTestPayloadWithCommitMessage(message string) *api.PushPayload {
        commit := &api.PayloadCommit{
                ID:      "2020558fe2e34debb818a514715839cabd25e778",
-               Message: "commit message",
+               Message: message,
                URL:     "http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778",
                Author: &api.PayloadUser{
                        Name:     "user1",