fix: pass merge commit messages to git via stdin (#39269)

`git commit --message=` passes the merge message as a single argument,
which Linux caps at 128 KiB and Windows at 32 KiB for the whole command
line. Long messages failed with `argument list too long` and the merge
box toast showed the raw HTML 500 page.

Pass the message via `--file=-` on stdin instead, and answer
fetch-action requests with JSON on server errors so the toast shows the
error text. Limits merge commit messages to 512KB which could be
extended or made configurable later.

Fixes: https://github.com/go-gitea/gitea/issues/39261
Fixes: https://github.com/go-gitea/gitea/issues/30276
Signed-off-by: wxiaoguang <wxiaoguang@gmail.com>
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
silverwind
2026-09-19 13:04:53 +00:00
committed by GitHub
co-authored by wxiaoguang
parent cc34c26172
commit cdf786ce92
21 changed files with 175 additions and 93 deletions
@@ -5,6 +5,8 @@ package httplib
import (
"context"
"errors"
"io"
"net"
"net/http"
"net/url"
@@ -240,3 +242,28 @@ func ParseGiteaSiteURL(ctx context.Context, s string) *GiteaSiteURL {
}
return ret
}
func IsGiteaFetchActionRequest(req *http.Request) bool {
return req.Header.Get("X-Gitea-Fetch-Action") != ""
}
func IsClientOrNetworkError(ctx context.Context, err error) bool {
if err == nil {
return false
}
if ctx.Err() != nil || errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) {
return true
}
// client request corrupted (e.g.: Content-Length is sent but body is incomplete)
if errors.Is(err, io.ErrUnexpectedEOF) {
return true
}
// network error
if _, ok := errors.AsType[net.Error](err); ok {
return true
}
return false
}