fix: avoid markup render panic (#38698)

fix #38697

The root problem is that "commitChecker.repo" can be nil when the render
is called without a real repo.
This commit is contained in:
wxiaoguang
2026-07-30 04:26:21 +08:00
committed by GitHub
parent 43390e802c
commit f34073b887
5 changed files with 38 additions and 50 deletions
+10 -7
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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