diff --git a/models/renderhelper/commit_checker.go b/models/renderhelper/commit_checker.go index 91a7e7b01ed..ff0717777dc 100644 --- a/models/renderhelper/commit_checker.go +++ b/models/renderhelper/commit_checker.go @@ -13,35 +13,38 @@ import ( ) type commitChecker struct { - ctx context.Context - commitCache map[string]bool - repo *repo_model.Repository + ctx context.Context + commitCache map[string]bool + repoOptional *repo_model.Repository gitRepo *git.Repository gitRepoCloser io.Closer } func newCommitChecker(ctx context.Context, repo *repo_model.Repository) *commitChecker { - return &commitChecker{ctx: ctx, commitCache: make(map[string]bool), repo: repo} + 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 := git.RepositoryFromContextOrOpen(c.ctx, c.repo) + r, closer, err := git.RepositoryFromContextOrOpen(c.ctx, c.repoOptional) if err != nil { - log.Error("Unable to open repository: %s, error: %v", c.repo.FullName(), err) + log.Error("Unable to open repository: %s, error: %v", c.repoOptional.FullName(), err) return false } c.gitRepo, c.gitRepoCloser = r, closer diff --git a/models/renderhelper/repo_comment.go b/models/renderhelper/repo_comment.go index 16e130a776b..595fe2d9cf0 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 0251de8da32..c587c39f2b5 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 9ebd54cfb2e..ec44e425ba2 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 4ddc5f47fc5..bf02d0a9597 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()) + } + }) }