aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwxiaoguang <wxiaoguang@gmail.com>2025-07-11 02:08:40 +0800
committerGitHub <noreply@github.com>2025-07-10 18:08:40 +0000
commit6ab6d4e17ff61b4eaf1a88e3d167f0d504b8390e (patch)
treec95efb742ef7b505ce1cb5d408aff75120237863
parent32152a0ac03e912567a9d9a243729a9ed6288255 (diff)
downloadgitea-6ab6d4e17ff61b4eaf1a88e3d167f0d504b8390e.tar.gz
gitea-6ab6d4e17ff61b4eaf1a88e3d167f0d504b8390e.zip
Support base64-encoded agit push options (#35037)
-rw-r--r--services/agit/agit.go18
-rw-r--r--services/agit/agit_test.go16
2 files changed, 32 insertions, 2 deletions
diff --git a/services/agit/agit.go b/services/agit/agit.go
index b27dfc8ecd..0ea8bbfa5d 100644
--- a/services/agit/agit.go
+++ b/services/agit/agit.go
@@ -5,6 +5,7 @@ package agit
import (
"context"
+ "encoding/base64"
"fmt"
"os"
"strings"
@@ -18,17 +19,30 @@ import (
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/private"
"code.gitea.io/gitea/modules/setting"
+ "code.gitea.io/gitea/modules/util"
notify_service "code.gitea.io/gitea/services/notify"
pull_service "code.gitea.io/gitea/services/pull"
)
+func parseAgitPushOptionValue(s string) string {
+ if base64Value, ok := strings.CutPrefix(s, "{base64}"); ok {
+ decoded, err := base64.StdEncoding.DecodeString(base64Value)
+ return util.Iif(err == nil, string(decoded), s)
+ }
+ return s
+}
+
// ProcReceive handle proc receive work
func ProcReceive(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, opts *private.HookOptions) ([]private.HookProcReceiveRefResult, error) {
results := make([]private.HookProcReceiveRefResult, 0, len(opts.OldCommitIDs))
forcePush := opts.GitPushOptions.Bool(private.GitPushOptionForcePush)
topicBranch := opts.GitPushOptions["topic"]
- title := strings.TrimSpace(opts.GitPushOptions["title"])
- description := strings.TrimSpace(opts.GitPushOptions["description"])
+
+ // some options are base64-encoded with "{base64}" prefix if they contain new lines
+ // other agit push options like "issue", "reviewer" and "cc" are not supported
+ title := parseAgitPushOptionValue(opts.GitPushOptions["title"])
+ description := parseAgitPushOptionValue(opts.GitPushOptions["description"])
+
objectFormat := git.ObjectFormatFromName(repo.ObjectFormatName)
userName := strings.ToLower(opts.UserName)
diff --git a/services/agit/agit_test.go b/services/agit/agit_test.go
new file mode 100644
index 0000000000..feaf7dca9b
--- /dev/null
+++ b/services/agit/agit_test.go
@@ -0,0 +1,16 @@
+// Copyright 2025 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package agit
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestParseAgitPushOptionValue(t *testing.T) {
+ assert.Equal(t, "a", parseAgitPushOptionValue("a"))
+ assert.Equal(t, "a", parseAgitPushOptionValue("{base64}YQ=="))
+ assert.Equal(t, "{base64}invalid value", parseAgitPushOptionValue("{base64}invalid value"))
+}