diff --git a/models/renderhelper/commit_checker.go b/models/renderhelper/commit_checker.go index faf2d94eb0..2c62d9ae36 100644 --- a/models/renderhelper/commit_checker.go +++ b/models/renderhelper/commit_checker.go @@ -7,41 +7,45 @@ import ( "context" "io" + repo_model "gitea.dev/models/repo" "gitea.dev/modules/git" "gitea.dev/modules/gitrepo" "gitea.dev/modules/log" ) type commitChecker struct { - ctx context.Context - commitCache map[string]bool - gitRepoFacade gitrepo.Repository + ctx context.Context + commitCache map[string]bool + repoOptional *repo_model.Repository gitRepo *git.Repository gitRepoCloser io.Closer } -func newCommitChecker(ctx context.Context, gitRepo gitrepo.Repository) *commitChecker { - return &commitChecker{ctx: ctx, commitCache: make(map[string]bool), gitRepoFacade: gitRepo} +func newCommitChecker(ctx context.Context, repo *repo_model.Repository) *commitChecker { + return &commitChecker{ctx: ctx, commitCache: make(map[string]bool), repoOptional: repo} } func (c *commitChecker) Close() error { - if c != nil && c.gitRepoCloser != nil { + if c.gitRepoCloser != nil { return c.gitRepoCloser.Close() } return nil } func (c *commitChecker) IsCommitIDExisting(commitID string) bool { + if c.repoOptional == nil { + return false + } exist, inCache := c.commitCache[commitID] if inCache { return exist } if c.gitRepo == nil { - r, closer, err := gitrepo.RepositoryFromContextOrOpen(c.ctx, c.gitRepoFacade) + r, closer, err := gitrepo.RepositoryFromContextOrOpen(c.ctx, c.repoOptional) if err != nil { - log.Error("unable to open repository: %s Error: %v", gitrepo.RepoGitURL(c.gitRepoFacade), err) + log.Error("unable to open repository: %s Error: %v", gitrepo.RepoGitURL(c.repoOptional), err) return false } c.gitRepo, c.gitRepoCloser = r, closer diff --git a/models/renderhelper/repo_comment.go b/models/renderhelper/repo_comment.go index 16e130a776..595fe2d9cf 100644 --- a/models/renderhelper/repo_comment.go +++ b/models/renderhelper/repo_comment.go @@ -51,10 +51,10 @@ func NewRenderContextRepoComment(ctx context.Context, repo *repo_model.Repositor helper := &RepoComment{opts: util.OptionalArg(opts)} rctx := markup.NewRenderContext(ctx) helper.ctx = rctx + helper.commitChecker = newCommitChecker(ctx, repo) var metas map[string]string if repo != nil { helper.repoLink = repo.Link() - helper.commitChecker = newCommitChecker(ctx, repo) metas = repo.ComposeCommentMetas(ctx) } else { // repo can be nil when rendering a commit message in user's dashboard feedback whose repository has been deleted diff --git a/models/renderhelper/repo_file.go b/models/renderhelper/repo_file.go index 0251de8da3..c587c39f2b 100644 --- a/models/renderhelper/repo_file.go +++ b/models/renderhelper/repo_file.go @@ -58,9 +58,9 @@ func NewRenderContextRepoFile(ctx context.Context, repo *repo_model.Repository, helper := &RepoFile{opts: util.OptionalArg(opts)} rctx := markup.NewRenderContext(ctx) helper.ctx = rctx + helper.commitChecker = newCommitChecker(ctx, repo) if repo != nil { helper.repoLink = repo.Link() - helper.commitChecker = newCommitChecker(ctx, repo) rctx = rctx.WithMetas(repo.ComposeRepoFileMetas(ctx)) } else { // this is almost dead code, only to pass the incorrect tests diff --git a/models/renderhelper/repo_wiki.go b/models/renderhelper/repo_wiki.go index 9ebd54cfb2..ec44e425ba 100644 --- a/models/renderhelper/repo_wiki.go +++ b/models/renderhelper/repo_wiki.go @@ -57,9 +57,9 @@ type RepoWikiOptions struct { func NewRenderContextRepoWiki(ctx context.Context, repo *repo_model.Repository, opts ...RepoWikiOptions) *markup.RenderContext { helper := &RepoWiki{opts: util.OptionalArg(opts)} rctx := markup.NewRenderContext(ctx).WithMarkupType(markdown.MarkupName) + helper.commitChecker = newCommitChecker(ctx, repo) if repo != nil { helper.repoLink = repo.Link() - helper.commitChecker = newCommitChecker(ctx, repo) rctx = rctx.WithMetas(repo.ComposeWikiMetas(ctx)) } else { // this is almost dead code, only to pass the incorrect tests diff --git a/routers/api/v1/misc/markup_test.go b/routers/api/v1/misc/markup_test.go index 4ddc5f47fc..bf02d0a959 100644 --- a/routers/api/v1/misc/markup_test.go +++ b/routers/api/v1/misc/markup_test.go @@ -177,49 +177,34 @@ Here are some links to the most important topics. You can find the full list of testRenderMarkup(t, "unknown", false, "", "## Test", "unsupported render mode: unknown\n", http.StatusUnprocessableEntity) } -var simpleCases = []string{ - // Guard wiki sidebar: special syntax - `[[Guardfile-DSL / Configuring-Guard|Guardfile-DSL---Configuring-Guard]]`, - // rendered - `

[[Guardfile-DSL / Configuring-Guard|Guardfile-DSL---Configuring-Guard]]

-`, - // special syntax - `[[Name|Link]]`, - // rendered - `

[[Name|Link]]

-`, - // empty - ``, - // rendered - ``, -} - func TestAPI_RenderSimple(t *testing.T) { setting.AppURL = AppURL markup.RenderBehaviorForTesting.DisableAdditionalAttributes = true - options := api.MarkdownOption{ - Mode: "markdown", - Text: "", - Context: "/user2/repo1", - } - ctx, resp := contexttest.MockAPIContext(t, "POST /api/v1/markdown") - for i := 0; i < len(simpleCases); i += 2 { - options.Text = simpleCases[i] - web.SetForm(ctx, &options) - Markdown(ctx) - assert.Equal(t, simpleCases[i+1], resp.Body.String()) - resp.Body.Reset() - } -} -func TestAPI_RenderRaw(t *testing.T) { - setting.AppURL = AppURL - markup.RenderBehaviorForTesting.DisableAdditionalAttributes = true - ctx, resp := contexttest.MockAPIContext(t, "POST /api/v1/markdown") - for i := 0; i < len(simpleCases); i += 2 { - ctx.Req.Body = io.NopCloser(strings.NewReader(simpleCases[i])) - MarkdownRaw(ctx) - assert.Equal(t, simpleCases[i+1], resp.Body.String()) - resp.Body.Reset() + testCases := []struct { + in, out string + mode string + }{ + {in: "", out: ""}, + {in: "[[special-syntax]]", out: "

[[special-syntax]]

\n", mode: "markdown"}, + {in: "[[special|syntax]]", out: "

[[special|syntax]]

\n", mode: "markdown"}, + {in: "01234567890123456789", out: "

01234567890123456789

\n", mode: "gfm"}, // commit-like content should not crash the render } + t.Run("markdown", func(t *testing.T) { + for _, c := range testCases { + options := api.MarkdownOption{Mode: c.mode, Text: c.in, Context: "/user2/repo1"} + ctx, resp := contexttest.MockAPIContext(t, "POST /api/v1/markdown") + web.SetForm(ctx, &options) + Markdown(ctx) + assert.Equal(t, c.out, resp.Body.String()) + } + }) + t.Run("markdown-raw", func(t *testing.T) { + for _, c := range testCases { + ctx, resp := contexttest.MockAPIContext(t, "POST /api/v1/markdown") + ctx.Req.Body = io.NopCloser(strings.NewReader(c.in)) + MarkdownRaw(ctx) + assert.Equal(t, c.out, resp.Body.String()) + } + }) }