diff --git a/modules/util/truncate.go b/modules/util/truncate.go new file mode 100644 index 0000000000..8d0f630973 --- /dev/null +++ b/modules/util/truncate.go @@ -0,0 +1,35 @@ +// Copyright 2021 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package util + +import "unicode/utf8" + +// SplitStringAtByteN splits a string at byte n accounting for rune boundaries. (Combining characters are not accounted for.) +func SplitStringAtByteN(input string, n int) (left, right string) { + if len(input) <= n { + left = input + return + } + + if !utf8.ValidString(input) { + left = input[:n-3] + "..." + right = "..." + input[n-3:] + return + } + + // in UTF8 "…" is 3 bytes so doesn't really gain us anything... + end := 0 + for end <= n-3 { + _, size := utf8.DecodeRuneInString(input[end:]) + if end+size > n-3 { + break + } + end += size + } + + left = input[:end] + "…" + right = "…" + input[end:] + return +} diff --git a/routers/web/repo/compare.go b/routers/web/repo/compare.go index fddfc4a63a..e66aa614cb 100644 --- a/routers/web/repo/compare.go +++ b/routers/web/repo/compare.go @@ -24,6 +24,7 @@ import ( "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/upload" + "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/services/gitdiff" ) @@ -567,6 +568,18 @@ func PrepareCompareDiff( } else { title = headBranch } + if len(title) > 255 { + var trailer string + title, trailer = util.SplitStringAtByteN(title, 255) + if len(trailer) > 0 { + if ctx.Data["content"] != nil { + ctx.Data["content"] = fmt.Sprintf("%s\n\n%s", trailer, ctx.Data["content"]) + } else { + ctx.Data["content"] = trailer + "\n" + } + } + } + ctx.Data["title"] = title ctx.Data["Username"] = headUser.Name ctx.Data["Reponame"] = headRepo.Name diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go index a299799647..703bbd837a 100644 --- a/routers/web/repo/pull.go +++ b/routers/web/repo/pull.go @@ -1001,10 +1001,14 @@ func CompareAndPullRequestPost(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("repo.pulls.compare_changes") ctx.Data["PageIsComparePull"] = true ctx.Data["IsDiffCompare"] = true + ctx.Data["IsRepoToolbarCommits"] = true + ctx.Data["RequireTribute"] = true + ctx.Data["RequireSimpleMDE"] = true ctx.Data["RequireHighlightJS"] = true ctx.Data["PullRequestWorkInProgressPrefixes"] = setting.Repository.PullRequest.WorkInProgressPrefixes ctx.Data["IsAttachmentEnabled"] = setting.Attachment.Enabled upload.AddUploadContext(ctx, "comment") + ctx.Data["HasIssuesOrPullsWritePermission"] = ctx.Repo.CanWrite(models.UnitTypePullRequests) var ( repo = ctx.Repo.Repository @@ -1037,6 +1041,14 @@ func CompareAndPullRequestPost(ctx *context.Context) { return } + if len(form.Title) > 255 { + var trailer string + form.Title, trailer = util.SplitStringAtByteN(form.Title, 255) + + form.Content = trailer + "\n\n" + form.Content + } + middleware.AssignForm(form, ctx.Data) + ctx.HTML(http.StatusOK, tplCompareDiff) return } diff --git a/templates/repo/diff/compare.tmpl b/templates/repo/diff/compare.tmpl index 7959ef7bb5..2beca57960 100644 --- a/templates/repo/diff/compare.tmpl +++ b/templates/repo/diff/compare.tmpl @@ -176,10 +176,10 @@ {{if .IsNothingToCompare}} {{if and $.IsSigned $.AllowEmptyPr (not .Repository.IsArchived) }}
{{.i18n.Tr "repo.pulls.nothing_to_compare_and_allow_empty_pr"}}
-
+
- {{else}} {{if and $.IsSigned (not .Repository.IsArchived)}} -
+
{{else if .Repository.IsArchived}} @@ -201,7 +201,7 @@
{{end}} {{if $.IsSigned}} -