mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09:00 
			
		
		
		
	Backport #34412 by wxiaoguang Fix #34398, fix #33308 Remove all `repo.ComposeCommentMetas` from templates, only use `repo` to render commit message. Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
		| @@ -47,7 +47,7 @@ func (c *commitChecker) IsCommitIDExisting(commitID string) bool { | |||||||
| 		c.gitRepo, c.gitRepoCloser = r, closer | 		c.gitRepo, c.gitRepoCloser = r, closer | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	exist = c.gitRepo.IsReferenceExist(commitID) // Don't use IsObjectExist since it doesn't support short hashs with gogit edition. | 	exist = c.gitRepo.IsReferenceExist(commitID) // Don't use IsObjectExist since it doesn't support short hashes with gogit edition. | ||||||
| 	c.commitCache[commitID] = exist | 	c.commitCache[commitID] = exist | ||||||
| 	return exist | 	return exist | ||||||
| } | } | ||||||
|   | |||||||
| @@ -17,6 +17,7 @@ import ( | |||||||
| func TestDateTime(t *testing.T) { | func TestDateTime(t *testing.T) { | ||||||
| 	testTz, _ := time.LoadLocation("America/New_York") | 	testTz, _ := time.LoadLocation("America/New_York") | ||||||
| 	defer test.MockVariableValue(&setting.DefaultUILocation, testTz)() | 	defer test.MockVariableValue(&setting.DefaultUILocation, testTz)() | ||||||
|  | 	defer test.MockVariableValue(&setting.IsProd, true)() | ||||||
| 	defer test.MockVariableValue(&setting.IsInTesting, false)() | 	defer test.MockVariableValue(&setting.IsInTesting, false)() | ||||||
|  |  | ||||||
| 	du := NewDateUtils() | 	du := NewDateUtils() | ||||||
| @@ -53,6 +54,7 @@ func TestDateTime(t *testing.T) { | |||||||
| func TestTimeSince(t *testing.T) { | func TestTimeSince(t *testing.T) { | ||||||
| 	testTz, _ := time.LoadLocation("America/New_York") | 	testTz, _ := time.LoadLocation("America/New_York") | ||||||
| 	defer test.MockVariableValue(&setting.DefaultUILocation, testTz)() | 	defer test.MockVariableValue(&setting.DefaultUILocation, testTz)() | ||||||
|  | 	defer test.MockVariableValue(&setting.IsProd, true)() | ||||||
| 	defer test.MockVariableValue(&setting.IsInTesting, false)() | 	defer test.MockVariableValue(&setting.IsInTesting, false)() | ||||||
|  |  | ||||||
| 	du := NewDateUtils() | 	du := NewDateUtils() | ||||||
|   | |||||||
| @@ -14,6 +14,8 @@ import ( | |||||||
| 	"unicode" | 	"unicode" | ||||||
|  |  | ||||||
| 	issues_model "code.gitea.io/gitea/models/issues" | 	issues_model "code.gitea.io/gitea/models/issues" | ||||||
|  | 	"code.gitea.io/gitea/models/renderhelper" | ||||||
|  | 	"code.gitea.io/gitea/models/repo" | ||||||
| 	"code.gitea.io/gitea/modules/emoji" | 	"code.gitea.io/gitea/modules/emoji" | ||||||
| 	"code.gitea.io/gitea/modules/htmlutil" | 	"code.gitea.io/gitea/modules/htmlutil" | ||||||
| 	"code.gitea.io/gitea/modules/log" | 	"code.gitea.io/gitea/modules/log" | ||||||
| @@ -34,11 +36,11 @@ func NewRenderUtils(ctx reqctx.RequestContext) *RenderUtils { | |||||||
| } | } | ||||||
|  |  | ||||||
| // RenderCommitMessage renders commit message with XSS-safe and special links. | // RenderCommitMessage renders commit message with XSS-safe and special links. | ||||||
| func (ut *RenderUtils) RenderCommitMessage(msg string, metas map[string]string) template.HTML { | func (ut *RenderUtils) RenderCommitMessage(msg string, repo *repo.Repository) template.HTML { | ||||||
| 	cleanMsg := template.HTMLEscapeString(msg) | 	cleanMsg := template.HTMLEscapeString(msg) | ||||||
| 	// we can safely assume that it will not return any error, since there | 	// we can safely assume that it will not return any error, since there | ||||||
| 	// shouldn't be any special HTML. | 	// shouldn't be any special HTML. | ||||||
| 	fullMessage, err := markup.PostProcessCommitMessage(markup.NewRenderContext(ut.ctx).WithMetas(metas), cleanMsg) | 	fullMessage, err := markup.PostProcessCommitMessage(renderhelper.NewRenderContextRepoComment(ut.ctx, repo), cleanMsg) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		log.Error("PostProcessCommitMessage: %v", err) | 		log.Error("PostProcessCommitMessage: %v", err) | ||||||
| 		return "" | 		return "" | ||||||
| @@ -52,7 +54,7 @@ func (ut *RenderUtils) RenderCommitMessage(msg string, metas map[string]string) | |||||||
|  |  | ||||||
| // RenderCommitMessageLinkSubject renders commit message as a XSS-safe link to | // RenderCommitMessageLinkSubject renders commit message as a XSS-safe link to | ||||||
| // the provided default url, handling for special links without email to links. | // the provided default url, handling for special links without email to links. | ||||||
| func (ut *RenderUtils) RenderCommitMessageLinkSubject(msg, urlDefault string, metas map[string]string) template.HTML { | func (ut *RenderUtils) RenderCommitMessageLinkSubject(msg, urlDefault string, repo *repo.Repository) template.HTML { | ||||||
| 	msgLine := strings.TrimLeftFunc(msg, unicode.IsSpace) | 	msgLine := strings.TrimLeftFunc(msg, unicode.IsSpace) | ||||||
| 	lineEnd := strings.IndexByte(msgLine, '\n') | 	lineEnd := strings.IndexByte(msgLine, '\n') | ||||||
| 	if lineEnd > 0 { | 	if lineEnd > 0 { | ||||||
| @@ -63,9 +65,8 @@ func (ut *RenderUtils) RenderCommitMessageLinkSubject(msg, urlDefault string, me | |||||||
| 		return "" | 		return "" | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// we can safely assume that it will not return any error, since there | 	// we can safely assume that it will not return any error, since there shouldn't be any special HTML. | ||||||
| 	// shouldn't be any special HTML. | 	renderedMessage, err := markup.PostProcessCommitMessageSubject(renderhelper.NewRenderContextRepoComment(ut.ctx, repo), urlDefault, template.HTMLEscapeString(msgLine)) | ||||||
| 	renderedMessage, err := markup.PostProcessCommitMessageSubject(markup.NewRenderContext(ut.ctx).WithMetas(metas), urlDefault, template.HTMLEscapeString(msgLine)) |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		log.Error("PostProcessCommitMessageSubject: %v", err) | 		log.Error("PostProcessCommitMessageSubject: %v", err) | ||||||
| 		return "" | 		return "" | ||||||
| @@ -74,7 +75,7 @@ func (ut *RenderUtils) RenderCommitMessageLinkSubject(msg, urlDefault string, me | |||||||
| } | } | ||||||
|  |  | ||||||
| // RenderCommitBody extracts the body of a commit message without its title. | // RenderCommitBody extracts the body of a commit message without its title. | ||||||
| func (ut *RenderUtils) RenderCommitBody(msg string, metas map[string]string) template.HTML { | func (ut *RenderUtils) RenderCommitBody(msg string, repo *repo.Repository) template.HTML { | ||||||
| 	msgLine := strings.TrimSpace(msg) | 	msgLine := strings.TrimSpace(msg) | ||||||
| 	lineEnd := strings.IndexByte(msgLine, '\n') | 	lineEnd := strings.IndexByte(msgLine, '\n') | ||||||
| 	if lineEnd > 0 { | 	if lineEnd > 0 { | ||||||
| @@ -87,7 +88,7 @@ func (ut *RenderUtils) RenderCommitBody(msg string, metas map[string]string) tem | |||||||
| 		return "" | 		return "" | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	renderedMessage, err := markup.PostProcessCommitMessage(markup.NewRenderContext(ut.ctx).WithMetas(metas), template.HTMLEscapeString(msgLine)) | 	renderedMessage, err := markup.PostProcessCommitMessage(renderhelper.NewRenderContextRepoComment(ut.ctx, repo), template.HTMLEscapeString(msgLine)) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		log.Error("PostProcessCommitMessage: %v", err) | 		log.Error("PostProcessCommitMessage: %v", err) | ||||||
| 		return "" | 		return "" | ||||||
| @@ -105,8 +106,8 @@ func renderCodeBlock(htmlEscapedTextToRender template.HTML) template.HTML { | |||||||
| } | } | ||||||
|  |  | ||||||
| // RenderIssueTitle renders issue/pull title with defined post processors | // RenderIssueTitle renders issue/pull title with defined post processors | ||||||
| func (ut *RenderUtils) RenderIssueTitle(text string, metas map[string]string) template.HTML { | func (ut *RenderUtils) RenderIssueTitle(text string, repo *repo.Repository) template.HTML { | ||||||
| 	renderedText, err := markup.PostProcessIssueTitle(markup.NewRenderContext(ut.ctx).WithMetas(metas), template.HTMLEscapeString(text)) | 	renderedText, err := markup.PostProcessIssueTitle(renderhelper.NewRenderContextRepoComment(ut.ctx, repo), template.HTMLEscapeString(text)) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		log.Error("PostProcessIssueTitle: %v", err) | 		log.Error("PostProcessIssueTitle: %v", err) | ||||||
| 		return "" | 		return "" | ||||||
|   | |||||||
| @@ -32,22 +32,22 @@ func renderMarkdownToHtmlLegacy(ctx context.Context, input string) template.HTML | |||||||
| 	return NewRenderUtils(reqctx.FromContext(ctx)).MarkdownToHtml(input) | 	return NewRenderUtils(reqctx.FromContext(ctx)).MarkdownToHtml(input) | ||||||
| } | } | ||||||
|  |  | ||||||
| func renderCommitMessageLegacy(ctx context.Context, msg string, metas map[string]string) template.HTML { | func renderCommitMessageLegacy(ctx context.Context, msg string, _ map[string]string) template.HTML { | ||||||
| 	panicIfDevOrTesting() | 	panicIfDevOrTesting() | ||||||
| 	return NewRenderUtils(reqctx.FromContext(ctx)).RenderCommitMessage(msg, metas) | 	return NewRenderUtils(reqctx.FromContext(ctx)).RenderCommitMessage(msg, nil) | ||||||
| } | } | ||||||
|  |  | ||||||
| func renderCommitMessageLinkSubjectLegacy(ctx context.Context, msg, urlDefault string, metas map[string]string) template.HTML { | func renderCommitMessageLinkSubjectLegacy(ctx context.Context, msg, urlDefault string, _ map[string]string) template.HTML { | ||||||
| 	panicIfDevOrTesting() | 	panicIfDevOrTesting() | ||||||
| 	return NewRenderUtils(reqctx.FromContext(ctx)).RenderCommitMessageLinkSubject(msg, urlDefault, metas) | 	return NewRenderUtils(reqctx.FromContext(ctx)).RenderCommitMessageLinkSubject(msg, urlDefault, nil) | ||||||
| } | } | ||||||
|  |  | ||||||
| func renderIssueTitleLegacy(ctx context.Context, text string, metas map[string]string) template.HTML { | func renderIssueTitleLegacy(ctx context.Context, text string, _ map[string]string) template.HTML { | ||||||
| 	panicIfDevOrTesting() | 	panicIfDevOrTesting() | ||||||
| 	return NewRenderUtils(reqctx.FromContext(ctx)).RenderIssueTitle(text, metas) | 	return NewRenderUtils(reqctx.FromContext(ctx)).RenderIssueTitle(text, nil) | ||||||
| } | } | ||||||
|  |  | ||||||
| func renderCommitBodyLegacy(ctx context.Context, msg string, metas map[string]string) template.HTML { | func renderCommitBodyLegacy(ctx context.Context, msg string, _ map[string]string) template.HTML { | ||||||
| 	panicIfDevOrTesting() | 	panicIfDevOrTesting() | ||||||
| 	return NewRenderUtils(reqctx.FromContext(ctx)).RenderCommitBody(msg, metas) | 	return NewRenderUtils(reqctx.FromContext(ctx)).RenderCommitBody(msg, nil) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -11,11 +11,11 @@ import ( | |||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/models/issues" | 	"code.gitea.io/gitea/models/issues" | ||||||
| 	"code.gitea.io/gitea/models/unittest" | 	"code.gitea.io/gitea/models/repo" | ||||||
| 	"code.gitea.io/gitea/modules/git" | 	user_model "code.gitea.io/gitea/models/user" | ||||||
| 	"code.gitea.io/gitea/modules/log" |  | ||||||
| 	"code.gitea.io/gitea/modules/markup" | 	"code.gitea.io/gitea/modules/markup" | ||||||
| 	"code.gitea.io/gitea/modules/reqctx" | 	"code.gitea.io/gitea/modules/reqctx" | ||||||
|  | 	"code.gitea.io/gitea/modules/setting" | ||||||
| 	"code.gitea.io/gitea/modules/test" | 	"code.gitea.io/gitea/modules/test" | ||||||
| 	"code.gitea.io/gitea/modules/translation" | 	"code.gitea.io/gitea/modules/translation" | ||||||
|  |  | ||||||
| @@ -47,19 +47,8 @@ mail@domain.com | |||||||
| 	return strings.ReplaceAll(s, "<SPACE>", " ") | 	return strings.ReplaceAll(s, "<SPACE>", " ") | ||||||
| } | } | ||||||
|  |  | ||||||
| var testMetas = map[string]string{ |  | ||||||
| 	"user":                         "user13", |  | ||||||
| 	"repo":                         "repo11", |  | ||||||
| 	"repoPath":                     "../../tests/gitea-repositories-meta/user13/repo11.git/", |  | ||||||
| 	"markdownNewLineHardBreak":     "true", |  | ||||||
| 	"markupAllowShortIssuePattern": "true", |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func TestMain(m *testing.M) { | func TestMain(m *testing.M) { | ||||||
| 	unittest.InitSettingsForTesting() | 	setting.Markdown.RenderOptionsComment.ShortIssuePattern = true | ||||||
| 	if err := git.InitSimple(context.Background()); err != nil { |  | ||||||
| 		log.Fatal("git init failed, err: %v", err) |  | ||||||
| 	} |  | ||||||
| 	markup.Init(&markup.RenderHelperFuncs{ | 	markup.Init(&markup.RenderHelperFuncs{ | ||||||
| 		IsUsernameMentionable: func(ctx context.Context, username string) bool { | 		IsUsernameMentionable: func(ctx context.Context, username string) bool { | ||||||
| 			return username == "mention-user" | 			return username == "mention-user" | ||||||
| @@ -74,46 +63,52 @@ func newTestRenderUtils(t *testing.T) *RenderUtils { | |||||||
| 	return NewRenderUtils(ctx) | 	return NewRenderUtils(ctx) | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestRenderCommitBody(t *testing.T) { | func TestRenderRepoComment(t *testing.T) { | ||||||
| 	defer test.MockVariableValue(&markup.RenderBehaviorForTesting.DisableAdditionalAttributes, true)() | 	mockRepo := &repo.Repository{ | ||||||
| 	type args struct { | 		ID: 1, OwnerName: "user13", Name: "repo11", | ||||||
| 		msg string | 		Owner: &user_model.User{ID: 13, Name: "user13"}, | ||||||
|  | 		Units: []*repo.RepoUnit{}, | ||||||
| 	} | 	} | ||||||
| 	tests := []struct { | 	t.Run("RenderCommitBody", func(t *testing.T) { | ||||||
| 		name string | 		defer test.MockVariableValue(&markup.RenderBehaviorForTesting.DisableAdditionalAttributes, true)() | ||||||
| 		args args | 		type args struct { | ||||||
| 		want template.HTML | 			msg string | ||||||
| 	}{ | 		} | ||||||
| 		{ | 		tests := []struct { | ||||||
| 			name: "multiple lines", | 			name string | ||||||
| 			args: args{ | 			args args | ||||||
| 				msg: "first line\nsecond line", | 			want template.HTML | ||||||
|  | 		}{ | ||||||
|  | 			{ | ||||||
|  | 				name: "multiple lines", | ||||||
|  | 				args: args{ | ||||||
|  | 					msg: "first line\nsecond line", | ||||||
|  | 				}, | ||||||
|  | 				want: "second line", | ||||||
| 			}, | 			}, | ||||||
| 			want: "second line", | 			{ | ||||||
| 		}, | 				name: "multiple lines with leading newlines", | ||||||
| 		{ | 				args: args{ | ||||||
| 			name: "multiple lines with leading newlines", | 					msg: "\n\n\n\nfirst line\nsecond line", | ||||||
| 			args: args{ | 				}, | ||||||
| 				msg: "\n\n\n\nfirst line\nsecond line", | 				want: "second line", | ||||||
| 			}, | 			}, | ||||||
| 			want: "second line", | 			{ | ||||||
| 		}, | 				name: "multiple lines with trailing newlines", | ||||||
| 		{ | 				args: args{ | ||||||
| 			name: "multiple lines with trailing newlines", | 					msg: "first line\nsecond line\n\n\n", | ||||||
| 			args: args{ | 				}, | ||||||
| 				msg: "first line\nsecond line\n\n\n", | 				want: "second line", | ||||||
| 			}, | 			}, | ||||||
| 			want: "second line", | 		} | ||||||
| 		}, | 		ut := newTestRenderUtils(t) | ||||||
| 	} | 		for _, tt := range tests { | ||||||
| 	ut := newTestRenderUtils(t) | 			t.Run(tt.name, func(t *testing.T) { | ||||||
| 	for _, tt := range tests { | 				assert.Equalf(t, tt.want, ut.RenderCommitBody(tt.args.msg, mockRepo), "RenderCommitBody(%v, %v)", tt.args.msg, nil) | ||||||
| 		t.Run(tt.name, func(t *testing.T) { | 			}) | ||||||
| 			assert.Equalf(t, tt.want, ut.RenderCommitBody(tt.args.msg, nil), "RenderCommitBody(%v, %v)", tt.args.msg, nil) | 		} | ||||||
| 		}) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	expected := `/just/a/path.bin | 		expected := `/just/a/path.bin | ||||||
| <a href="https://example.com/file.bin">https://example.com/file.bin</a> | <a href="https://example.com/file.bin">https://example.com/file.bin</a> | ||||||
| [local link](file.bin) | [local link](file.bin) | ||||||
| [remote link](<a href="https://example.com">https://example.com</a>) | [remote link](<a href="https://example.com">https://example.com</a>) | ||||||
| @@ -132,22 +127,22 @@ com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit | |||||||
| <a href="/mention-user">@mention-user</a> test | <a href="/mention-user">@mention-user</a> test | ||||||
| <a href="/user13/repo11/issues/123" class="ref-issue">#123</a> | <a href="/user13/repo11/issues/123" class="ref-issue">#123</a> | ||||||
|   space` |   space` | ||||||
| 	assert.Equal(t, expected, string(newTestRenderUtils(t).RenderCommitBody(testInput(), testMetas))) | 		assert.Equal(t, expected, string(newTestRenderUtils(t).RenderCommitBody(testInput(), mockRepo))) | ||||||
| } | 	}) | ||||||
|  |  | ||||||
| func TestRenderCommitMessage(t *testing.T) { | 	t.Run("RenderCommitMessage", func(t *testing.T) { | ||||||
| 	expected := `space <a href="/mention-user" data-markdown-generated-content="">@mention-user</a>  ` | 		expected := `space <a href="/mention-user" data-markdown-generated-content="">@mention-user</a>  ` | ||||||
| 	assert.EqualValues(t, expected, newTestRenderUtils(t).RenderCommitMessage(testInput(), testMetas)) | 		assert.EqualValues(t, expected, newTestRenderUtils(t).RenderCommitMessage(testInput(), mockRepo)) | ||||||
| } | 	}) | ||||||
|  |  | ||||||
| func TestRenderCommitMessageLinkSubject(t *testing.T) { | 	t.Run("RenderCommitMessageLinkSubject", func(t *testing.T) { | ||||||
| 	expected := `<a href="https://example.com/link" class="muted">space </a><a href="/mention-user" data-markdown-generated-content="">@mention-user</a>` | 		expected := `<a href="https://example.com/link" class="muted">space </a><a href="/mention-user" data-markdown-generated-content="">@mention-user</a>` | ||||||
| 	assert.EqualValues(t, expected, newTestRenderUtils(t).RenderCommitMessageLinkSubject(testInput(), "https://example.com/link", testMetas)) | 		assert.EqualValues(t, expected, newTestRenderUtils(t).RenderCommitMessageLinkSubject(testInput(), "https://example.com/link", mockRepo)) | ||||||
| } | 	}) | ||||||
|  |  | ||||||
| func TestRenderIssueTitle(t *testing.T) { | 	t.Run("RenderIssueTitle", func(t *testing.T) { | ||||||
| 	defer test.MockVariableValue(&markup.RenderBehaviorForTesting.DisableAdditionalAttributes, true)() | 		defer test.MockVariableValue(&markup.RenderBehaviorForTesting.DisableAdditionalAttributes, true)() | ||||||
| 	expected := `  space @mention-user<SPACE><SPACE> | 		expected := `  space @mention-user<SPACE><SPACE> | ||||||
| /just/a/path.bin | /just/a/path.bin | ||||||
| https://example.com/file.bin | https://example.com/file.bin | ||||||
| [local link](file.bin) | [local link](file.bin) | ||||||
| @@ -168,8 +163,9 @@ mail@domain.com | |||||||
| <a href="/user13/repo11/issues/123" class="ref-issue">#123</a> | <a href="/user13/repo11/issues/123" class="ref-issue">#123</a> | ||||||
|   space<SPACE><SPACE> |   space<SPACE><SPACE> | ||||||
| ` | ` | ||||||
| 	expected = strings.ReplaceAll(expected, "<SPACE>", " ") | 		expected = strings.ReplaceAll(expected, "<SPACE>", " ") | ||||||
| 	assert.Equal(t, expected, string(newTestRenderUtils(t).RenderIssueTitle(testInput(), testMetas))) | 		assert.Equal(t, expected, string(newTestRenderUtils(t).RenderIssueTitle(testInput(), mockRepo))) | ||||||
|  | 	}) | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestRenderMarkdownToHtml(t *testing.T) { | func TestRenderMarkdownToHtml(t *testing.T) { | ||||||
|   | |||||||
| @@ -201,7 +201,7 @@ func feedActionsToFeedItems(ctx *context.Context, actions activities_model.Actio | |||||||
| 			switch act.OpType { | 			switch act.OpType { | ||||||
| 			case activities_model.ActionCommitRepo, activities_model.ActionMirrorSyncPush: | 			case activities_model.ActionCommitRepo, activities_model.ActionMirrorSyncPush: | ||||||
| 				push := templates.ActionContent2Commits(act) | 				push := templates.ActionContent2Commits(act) | ||||||
|  | 				_ = act.LoadRepo(ctx) | ||||||
| 				for _, commit := range push.Commits { | 				for _, commit := range push.Commits { | ||||||
| 					if len(desc) != 0 { | 					if len(desc) != 0 { | ||||||
| 						desc += "\n\n" | 						desc += "\n\n" | ||||||
| @@ -209,7 +209,7 @@ func feedActionsToFeedItems(ctx *context.Context, actions activities_model.Actio | |||||||
| 					desc += fmt.Sprintf("<a href=\"%s\">%s</a>\n%s", | 					desc += fmt.Sprintf("<a href=\"%s\">%s</a>\n%s", | ||||||
| 						html.EscapeString(fmt.Sprintf("%s/commit/%s", act.GetRepoAbsoluteLink(ctx), commit.Sha1)), | 						html.EscapeString(fmt.Sprintf("%s/commit/%s", act.GetRepoAbsoluteLink(ctx), commit.Sha1)), | ||||||
| 						commit.Sha1, | 						commit.Sha1, | ||||||
| 						renderUtils.RenderCommitMessage(commit.Message, nil), | 						renderUtils.RenderCommitMessage(commit.Message, act.Repo), | ||||||
| 					) | 					) | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -200,13 +200,9 @@ func ViewPost(ctx *context_module.Context) { | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// TODO: "ComposeCommentMetas" (usually for comment) is not quite right, but it is still the same as what template "RenderCommitMessage" does. |  | ||||||
| 	// need to be refactored together in the future |  | ||||||
| 	metas := ctx.Repo.Repository.ComposeCommentMetas(ctx) |  | ||||||
|  |  | ||||||
| 	// the title for the "run" is from the commit message | 	// the title for the "run" is from the commit message | ||||||
| 	resp.State.Run.Title = run.Title | 	resp.State.Run.Title = run.Title | ||||||
| 	resp.State.Run.TitleHTML = templates.NewRenderUtils(ctx).RenderCommitMessage(run.Title, metas) | 	resp.State.Run.TitleHTML = templates.NewRenderUtils(ctx).RenderCommitMessage(run.Title, ctx.Repo.Repository) | ||||||
| 	resp.State.Run.Link = run.Link() | 	resp.State.Run.Link = run.Link() | ||||||
| 	resp.State.Run.CanCancel = !run.Status.IsDone() && ctx.Repo.CanWrite(unit.TypeActions) | 	resp.State.Run.CanCancel = !run.Status.IsDone() && ctx.Repo.CanWrite(unit.TypeActions) | ||||||
| 	resp.State.Run.CanApprove = run.NeedApproval && ctx.Repo.CanWrite(unit.TypeActions) | 	resp.State.Run.CanApprove = run.NeedApproval && ctx.Repo.CanWrite(unit.TypeActions) | ||||||
|   | |||||||
| @@ -27,7 +27,7 @@ | |||||||
| 									<button class="btn interact-fg tw-px-1" data-clipboard-text="{{.DefaultBranchBranch.DBBranch.Name}}" data-tooltip-content="{{ctx.Locale.Tr "copy_branch"}}">{{svg "octicon-copy" 14}}</button> | 									<button class="btn interact-fg tw-px-1" data-clipboard-text="{{.DefaultBranchBranch.DBBranch.Name}}" data-tooltip-content="{{ctx.Locale.Tr "copy_branch"}}">{{svg "octicon-copy" 14}}</button> | ||||||
| 									{{template "repo/commit_statuses" dict "Status" (index $.CommitStatus .DefaultBranchBranch.DBBranch.CommitID) "Statuses" (index $.CommitStatuses .DefaultBranchBranch.DBBranch.CommitID)}} | 									{{template "repo/commit_statuses" dict "Status" (index $.CommitStatus .DefaultBranchBranch.DBBranch.CommitID) "Statuses" (index $.CommitStatuses .DefaultBranchBranch.DBBranch.CommitID)}} | ||||||
| 								</div> | 								</div> | ||||||
| 								<p class="info tw-flex tw-items-center tw-my-1">{{svg "octicon-git-commit" 16 "tw-mr-1"}}<a href="{{.RepoLink}}/commit/{{PathEscape .DefaultBranchBranch.DBBranch.CommitID}}">{{ShortSha .DefaultBranchBranch.DBBranch.CommitID}}</a> · <span class="commit-message">{{ctx.RenderUtils.RenderCommitMessage .DefaultBranchBranch.DBBranch.CommitMessage (.Repository.ComposeCommentMetas ctx)}}</span> · {{ctx.Locale.Tr "org.repo_updated"}} {{DateUtils.TimeSince .DefaultBranchBranch.DBBranch.CommitTime}}{{if .DefaultBranchBranch.DBBranch.Pusher}}  {{template "shared/user/avatarlink" dict "user" .DefaultBranchBranch.DBBranch.Pusher}}{{template "shared/user/namelink" .DefaultBranchBranch.DBBranch.Pusher}}{{end}}</p> | 								<p class="info tw-flex tw-items-center tw-my-1">{{svg "octicon-git-commit" 16 "tw-mr-1"}}<a href="{{.RepoLink}}/commit/{{PathEscape .DefaultBranchBranch.DBBranch.CommitID}}">{{ShortSha .DefaultBranchBranch.DBBranch.CommitID}}</a> · <span class="commit-message">{{ctx.RenderUtils.RenderCommitMessage .DefaultBranchBranch.DBBranch.CommitMessage .Repository}}</span> · {{ctx.Locale.Tr "org.repo_updated"}} {{DateUtils.TimeSince .DefaultBranchBranch.DBBranch.CommitTime}}{{if .DefaultBranchBranch.DBBranch.Pusher}}  {{template "shared/user/avatarlink" dict "user" .DefaultBranchBranch.DBBranch.Pusher}}{{template "shared/user/namelink" .DefaultBranchBranch.DBBranch.Pusher}}{{end}}</p> | ||||||
| 							</td> | 							</td> | ||||||
| 							{{/* FIXME: here and below, the tw-overflow-visible is not quite right but it is still needed the moment: to show the important buttons when the width is narrow */}} | 							{{/* FIXME: here and below, the tw-overflow-visible is not quite right but it is still needed the moment: to show the important buttons when the width is narrow */}} | ||||||
| 							<td class="tw-text-right tw-overflow-visible"> | 							<td class="tw-text-right tw-overflow-visible"> | ||||||
| @@ -103,7 +103,7 @@ | |||||||
| 									<button class="btn interact-fg tw-px-1" data-clipboard-text="{{.DBBranch.Name}}" data-tooltip-content="{{ctx.Locale.Tr "copy_branch"}}">{{svg "octicon-copy" 14}}</button> | 									<button class="btn interact-fg tw-px-1" data-clipboard-text="{{.DBBranch.Name}}" data-tooltip-content="{{ctx.Locale.Tr "copy_branch"}}">{{svg "octicon-copy" 14}}</button> | ||||||
| 									{{template "repo/commit_statuses" dict "Status" (index $.CommitStatus .DBBranch.CommitID) "Statuses" (index $.CommitStatuses .DBBranch.CommitID)}} | 									{{template "repo/commit_statuses" dict "Status" (index $.CommitStatus .DBBranch.CommitID) "Statuses" (index $.CommitStatuses .DBBranch.CommitID)}} | ||||||
| 								</div> | 								</div> | ||||||
| 								<p class="info tw-flex tw-items-center tw-my-1">{{svg "octicon-git-commit" 16 "tw-mr-1"}}<a href="{{$.RepoLink}}/commit/{{PathEscape .DBBranch.CommitID}}">{{ShortSha .DBBranch.CommitID}}</a> · <span class="commit-message">{{ctx.RenderUtils.RenderCommitMessage .DBBranch.CommitMessage ($.Repository.ComposeCommentMetas ctx)}}</span> · {{ctx.Locale.Tr "org.repo_updated"}} {{DateUtils.TimeSince .DBBranch.CommitTime}}{{if .DBBranch.Pusher}}  {{template "shared/user/avatarlink" dict "user" .DBBranch.Pusher}}  {{template "shared/user/namelink" .DBBranch.Pusher}}{{end}}</p> | 								<p class="info tw-flex tw-items-center tw-my-1">{{svg "octicon-git-commit" 16 "tw-mr-1"}}<a href="{{$.RepoLink}}/commit/{{PathEscape .DBBranch.CommitID}}">{{ShortSha .DBBranch.CommitID}}</a> · <span class="commit-message">{{ctx.RenderUtils.RenderCommitMessage .DBBranch.CommitMessage $.Repository}}</span> · {{ctx.Locale.Tr "org.repo_updated"}} {{DateUtils.TimeSince .DBBranch.CommitTime}}{{if .DBBranch.Pusher}}  {{template "shared/user/avatarlink" dict "user" .DBBranch.Pusher}}  {{template "shared/user/namelink" .DBBranch.Pusher}}{{end}}</p> | ||||||
| 							{{end}} | 							{{end}} | ||||||
| 							</td> | 							</td> | ||||||
| 							<td class="two wide ui"> | 							<td class="two wide ui"> | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ | |||||||
| 	<div class="ui container fluid padded"> | 	<div class="ui container fluid padded"> | ||||||
| 		<div class="ui top attached header clearing segment tw-relative commit-header"> | 		<div class="ui top attached header clearing segment tw-relative commit-header"> | ||||||
| 			<div class="tw-flex tw-mb-4 tw-gap-1"> | 			<div class="tw-flex tw-mb-4 tw-gap-1"> | ||||||
| 				<h3 class="tw-mb-0 tw-flex-1"><span class="commit-summary" title="{{.Commit.Summary}}">{{ctx.RenderUtils.RenderCommitMessage .Commit.Message ($.Repository.ComposeCommentMetas ctx)}}</span>{{template "repo/commit_statuses" dict "Status" .CommitStatus "Statuses" .CommitStatuses}}</h3> | 				<h3 class="tw-mb-0 tw-flex-1"><span class="commit-summary" title="{{.Commit.Summary}}">{{ctx.RenderUtils.RenderCommitMessage .Commit.Message $.Repository}}</span>{{template "repo/commit_statuses" dict "Status" .CommitStatus "Statuses" .CommitStatuses}}</h3> | ||||||
| 				{{if not $.PageIsWiki}} | 				{{if not $.PageIsWiki}} | ||||||
| 					<div class="commit-header-buttons"> | 					<div class="commit-header-buttons"> | ||||||
| 						<a class="ui primary tiny button" href="{{.SourcePath}}"> | 						<a class="ui primary tiny button" href="{{.SourcePath}}"> | ||||||
| @@ -122,7 +122,7 @@ | |||||||
| 				{{end}} | 				{{end}} | ||||||
| 			</div> | 			</div> | ||||||
| 			{{if IsMultilineCommitMessage .Commit.Message}} | 			{{if IsMultilineCommitMessage .Commit.Message}} | ||||||
| 				<pre class="commit-body">{{ctx.RenderUtils.RenderCommitBody .Commit.Message ($.Repository.ComposeCommentMetas ctx)}}</pre> | 				<pre class="commit-body">{{ctx.RenderUtils.RenderCommitBody .Commit.Message $.Repository}}</pre> | ||||||
| 			{{end}} | 			{{end}} | ||||||
| 			{{template "repo/commit_load_branches_and_tags" .}} | 			{{template "repo/commit_load_branches_and_tags" .}} | ||||||
| 		</div> | 		</div> | ||||||
|   | |||||||
| @@ -44,7 +44,7 @@ | |||||||
| 							<span class="commit-summary {{if gt .ParentCount 1}} grey text{{end}}" title="{{.Summary}}">{{.Summary | ctx.RenderUtils.RenderEmoji}}</span> | 							<span class="commit-summary {{if gt .ParentCount 1}} grey text{{end}}" title="{{.Summary}}">{{.Summary | ctx.RenderUtils.RenderEmoji}}</span> | ||||||
| 						{{else}} | 						{{else}} | ||||||
| 							{{$commitLink:= printf "%s/commit/%s" $commitRepoLink (PathEscape .ID.String)}} | 							{{$commitLink:= printf "%s/commit/%s" $commitRepoLink (PathEscape .ID.String)}} | ||||||
| 							<span class="commit-summary {{if gt .ParentCount 1}} grey text{{end}}" title="{{.Summary}}">{{ctx.RenderUtils.RenderCommitMessageLinkSubject .Message $commitLink ($.Repository.ComposeCommentMetas ctx)}}</span> | 							<span class="commit-summary {{if gt .ParentCount 1}} grey text{{end}}" title="{{.Summary}}">{{ctx.RenderUtils.RenderCommitMessageLinkSubject .Message $commitLink $.Repository}}</span> | ||||||
| 						{{end}} | 						{{end}} | ||||||
| 						</span> | 						</span> | ||||||
| 						{{if IsMultilineCommitMessage .Message}} | 						{{if IsMultilineCommitMessage .Message}} | ||||||
| @@ -52,7 +52,7 @@ | |||||||
| 						{{end}} | 						{{end}} | ||||||
| 						{{template "repo/commit_statuses" dict "Status" .Status "Statuses" .Statuses}} | 						{{template "repo/commit_statuses" dict "Status" .Status "Statuses" .Statuses}} | ||||||
| 						{{if IsMultilineCommitMessage .Message}} | 						{{if IsMultilineCommitMessage .Message}} | ||||||
| 						<pre class="commit-body tw-hidden">{{ctx.RenderUtils.RenderCommitBody .Message ($.Repository.ComposeCommentMetas ctx)}}</pre> | 						<pre class="commit-body tw-hidden">{{ctx.RenderUtils.RenderCommitBody .Message $.Repository}}</pre> | ||||||
| 						{{end}} | 						{{end}} | ||||||
| 						{{if $.CommitsTagsMap}} | 						{{if $.CommitsTagsMap}} | ||||||
| 							{{range (index $.CommitsTagsMap .ID.String)}} | 							{{range (index $.CommitsTagsMap .ID.String)}} | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ | |||||||
| 		{{$commitLink:= printf "%s/%s" $commitBaseLink (PathEscape .ID.String)}} | 		{{$commitLink:= printf "%s/%s" $commitBaseLink (PathEscape .ID.String)}} | ||||||
|  |  | ||||||
| 		<span class="tw-flex-1 tw-font-mono gt-ellipsis" title="{{.Summary}}"> | 		<span class="tw-flex-1 tw-font-mono gt-ellipsis" title="{{.Summary}}"> | ||||||
| 			{{- ctx.RenderUtils.RenderCommitMessageLinkSubject .Message $commitLink ($.comment.Issue.PullRequest.BaseRepo.ComposeCommentMetas ctx) -}} | 			{{- ctx.RenderUtils.RenderCommitMessageLinkSubject .Message $commitLink $.comment.Issue.PullRequest.BaseRepo -}} | ||||||
| 		</span> | 		</span> | ||||||
|  |  | ||||||
| 		{{if IsMultilineCommitMessage .Message}} | 		{{if IsMultilineCommitMessage .Message}} | ||||||
| @@ -29,7 +29,7 @@ | |||||||
| 	</div> | 	</div> | ||||||
| 	{{if IsMultilineCommitMessage .Message}} | 	{{if IsMultilineCommitMessage .Message}} | ||||||
| 	<pre class="commit-body tw-ml-[33px] tw-hidden" data-singular-commit-body-for="{{$tag}}"> | 	<pre class="commit-body tw-ml-[33px] tw-hidden" data-singular-commit-body-for="{{$tag}}"> | ||||||
| 		{{- ctx.RenderUtils.RenderCommitBody .Message ($.comment.Issue.PullRequest.BaseRepo.ComposeCommentMetas ctx) -}} | 		{{- ctx.RenderUtils.RenderCommitBody .Message $.comment.Issue.PullRequest.BaseRepo -}} | ||||||
| 	</pre> | 	</pre> | ||||||
| 	{{end}} | 	{{end}} | ||||||
| {{end}} | {{end}} | ||||||
|   | |||||||
| @@ -189,7 +189,7 @@ | |||||||
| 				<div class="ui segment flex-text-block tw-gap-4"> | 				<div class="ui segment flex-text-block tw-gap-4"> | ||||||
| 					{{template "shared/issueicon" .}} | 					{{template "shared/issueicon" .}} | ||||||
| 					<div class="issue-title tw-break-anywhere"> | 					<div class="issue-title tw-break-anywhere"> | ||||||
| 						{{ctx.RenderUtils.RenderIssueTitle .PullRequest.Issue.Title ($.Repository.ComposeCommentMetas ctx)}} | 						{{ctx.RenderUtils.RenderIssueTitle .PullRequest.Issue.Title $.Repository}} | ||||||
| 						<span class="index">#{{.PullRequest.Issue.Index}}</span> | 						<span class="index">#{{.PullRequest.Issue.Index}}</span> | ||||||
| 					</div> | 					</div> | ||||||
| 					<a href="{{$.RepoLink}}/pulls/{{.PullRequest.Issue.Index}}" class="ui compact button primary"> | 					<a href="{{$.RepoLink}}/pulls/{{.PullRequest.Issue.Index}}" class="ui compact button primary"> | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ | |||||||
| 					{{template "repo/commit_sign_badge" dict "Commit" $commit.Commit "CommitBaseLink" (print $.RepoLink "/commit") "CommitSignVerification" $commit.Verification}} | 					{{template "repo/commit_sign_badge" dict "Commit" $commit.Commit "CommitBaseLink" (print $.RepoLink "/commit") "CommitSignVerification" $commit.Verification}} | ||||||
|  |  | ||||||
| 					<span class="message tw-inline-block gt-ellipsis"> | 					<span class="message tw-inline-block gt-ellipsis"> | ||||||
| 						<span>{{ctx.RenderUtils.RenderCommitMessage $commit.Subject ($.Repository.ComposeCommentMetas ctx)}}</span> | 						<span>{{ctx.RenderUtils.RenderCommitMessage $commit.Subject $.Repository}}</span> | ||||||
| 					</span> | 					</span> | ||||||
|  |  | ||||||
| 					<span class="commit-refs flex-text-inline"> | 					<span class="commit-refs flex-text-inline"> | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ | |||||||
| 	{{$canEditIssueTitle := and (or .HasIssuesOrPullsWritePermission .IsIssuePoster) (not .Repository.IsArchived)}} | 	{{$canEditIssueTitle := and (or .HasIssuesOrPullsWritePermission .IsIssuePoster) (not .Repository.IsArchived)}} | ||||||
| 	<div class="issue-title" id="issue-title-display"> | 	<div class="issue-title" id="issue-title-display"> | ||||||
| 		<h1 class="tw-break-anywhere"> | 		<h1 class="tw-break-anywhere"> | ||||||
| 			{{ctx.RenderUtils.RenderIssueTitle .Issue.Title ($.Repository.ComposeCommentMetas ctx)}} | 			{{ctx.RenderUtils.RenderIssueTitle .Issue.Title $.Repository}} | ||||||
| 			<span class="index">#{{.Issue.Index}}</span> | 			<span class="index">#{{.Issue.Index}}</span> | ||||||
| 		</h1> | 		</h1> | ||||||
| 		<div class="issue-title-buttons"> | 		<div class="issue-title-buttons"> | ||||||
|   | |||||||
| @@ -21,10 +21,10 @@ | |||||||
| 	{{template "repo/commit_statuses" dict "Status" .LatestCommitStatus "Statuses" .LatestCommitStatuses}} | 	{{template "repo/commit_statuses" dict "Status" .LatestCommitStatus "Statuses" .LatestCommitStatuses}} | ||||||
|  |  | ||||||
| 	{{$commitLink:= printf "%s/commit/%s" .RepoLink (PathEscape .LatestCommit.ID.String)}} | 	{{$commitLink:= printf "%s/commit/%s" .RepoLink (PathEscape .LatestCommit.ID.String)}} | ||||||
| 	<span class="grey commit-summary" title="{{.LatestCommit.Summary}}"><span class="message-wrapper">{{ctx.RenderUtils.RenderCommitMessageLinkSubject .LatestCommit.Message $commitLink ($.Repository.ComposeCommentMetas ctx)}}</span> | 	<span class="grey commit-summary" title="{{.LatestCommit.Summary}}"><span class="message-wrapper">{{ctx.RenderUtils.RenderCommitMessageLinkSubject .LatestCommit.Message $commitLink $.Repository}}</span> | ||||||
| 		{{if IsMultilineCommitMessage .LatestCommit.Message}} | 		{{if IsMultilineCommitMessage .LatestCommit.Message}} | ||||||
| 			<button class="ui button ellipsis-button" aria-expanded="false" data-global-click="onRepoEllipsisButtonClick">...</button> | 			<button class="ui button ellipsis-button" aria-expanded="false" data-global-click="onRepoEllipsisButtonClick">...</button> | ||||||
| 			<pre class="commit-body tw-hidden">{{ctx.RenderUtils.RenderCommitBody .LatestCommit.Message ($.Repository.ComposeCommentMetas ctx)}}</pre> | 			<pre class="commit-body tw-hidden">{{ctx.RenderUtils.RenderCommitBody .LatestCommit.Message $.Repository}}</pre> | ||||||
| 		{{end}} | 		{{end}} | ||||||
| 	</span> | 	</span> | ||||||
| {{end}} | {{end}} | ||||||
|   | |||||||
| @@ -47,7 +47,7 @@ | |||||||
| 			<div class="repo-file-cell message loading-icon-2px"> | 			<div class="repo-file-cell message loading-icon-2px"> | ||||||
| 				{{if $commit}} | 				{{if $commit}} | ||||||
| 					{{$commitLink := printf "%s/commit/%s" $.RepoLink (PathEscape $commit.ID.String)}} | 					{{$commitLink := printf "%s/commit/%s" $.RepoLink (PathEscape $commit.ID.String)}} | ||||||
| 					{{ctx.RenderUtils.RenderCommitMessageLinkSubject $commit.Message $commitLink ($.Repository.ComposeCommentMetas ctx)}} | 					{{ctx.RenderUtils.RenderCommitMessageLinkSubject $commit.Message $commitLink $.Repository}} | ||||||
| 				{{else}} | 				{{else}} | ||||||
| 					… {{/* will be loaded again by LastCommitLoaderURL */}} | 					… {{/* will be loaded again by LastCommitLoaderURL */}} | ||||||
| 				{{end}} | 				{{end}} | ||||||
|   | |||||||
| @@ -94,7 +94,7 @@ | |||||||
| 								<img alt class="ui avatar" src="{{$push.AvatarLink ctx .AuthorEmail}}" title="{{.AuthorName}}" width="16" height="16"> | 								<img alt class="ui avatar" src="{{$push.AvatarLink ctx .AuthorEmail}}" title="{{.AuthorName}}" width="16" height="16"> | ||||||
| 								<a class="ui sha label" href="{{$commitLink}}">{{ShortSha .Sha1}}</a> | 								<a class="ui sha label" href="{{$commitLink}}">{{ShortSha .Sha1}}</a> | ||||||
| 								<span class="text truncate"> | 								<span class="text truncate"> | ||||||
| 									{{ctx.RenderUtils.RenderCommitMessage .Message ($repo.ComposeCommentMetas ctx)}} | 									{{ctx.RenderUtils.RenderCommitMessage .Message $repo}} | ||||||
| 								</span> | 								</span> | ||||||
| 							</div> | 							</div> | ||||||
| 						{{end}} | 						{{end}} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user