Ensure wiki repos are all closed (#16886)

There are multiple places where wiki git repositories are not properly closed.

This PR ensures they are closed.

Signed-off-by: Andrew Thornton <art27@cantab.net>
This commit is contained in:
zeripath 2021-08-30 21:50:35 +01:00 committed by GitHub
parent 73394f435c
commit 9119d24573
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 34 additions and 32 deletions

View File

@ -135,6 +135,9 @@ func wikiContentsByName(ctx *context.Context, commit *git.Commit, wikiName strin
func renderViewPage(ctx *context.Context) (*git.Repository, *git.TreeEntry) { func renderViewPage(ctx *context.Context) (*git.Repository, *git.TreeEntry) {
wikiRepo, commit, err := findWikiRepoCommit(ctx) wikiRepo, commit, err := findWikiRepoCommit(ctx)
if err != nil { if err != nil {
if wikiRepo != nil {
wikiRepo.Close()
}
if !git.IsErrNotExist(err) { if !git.IsErrNotExist(err) {
ctx.ServerError("GetBranchCommit", err) ctx.ServerError("GetBranchCommit", err)
} }
@ -222,6 +225,9 @@ func renderViewPage(ctx *context.Context) (*git.Repository, *git.TreeEntry) {
var buf strings.Builder var buf strings.Builder
if err := markdown.Render(rctx, bytes.NewReader(data), &buf); err != nil { if err := markdown.Render(rctx, bytes.NewReader(data), &buf); err != nil {
if wikiRepo != nil {
wikiRepo.Close()
}
ctx.ServerError("Render", err) ctx.ServerError("Render", err)
return nil, nil return nil, nil
} }
@ -229,6 +235,9 @@ func renderViewPage(ctx *context.Context) (*git.Repository, *git.TreeEntry) {
buf.Reset() buf.Reset()
if err := markdown.Render(rctx, bytes.NewReader(sidebarContent), &buf); err != nil { if err := markdown.Render(rctx, bytes.NewReader(sidebarContent), &buf); err != nil {
if wikiRepo != nil {
wikiRepo.Close()
}
ctx.ServerError("Render", err) ctx.ServerError("Render", err)
return nil, nil return nil, nil
} }
@ -237,6 +246,9 @@ func renderViewPage(ctx *context.Context) (*git.Repository, *git.TreeEntry) {
buf.Reset() buf.Reset()
if err := markdown.Render(rctx, bytes.NewReader(footerContent), &buf); err != nil { if err := markdown.Render(rctx, bytes.NewReader(footerContent), &buf); err != nil {
if wikiRepo != nil {
wikiRepo.Close()
}
ctx.ServerError("Render", err) ctx.ServerError("Render", err)
return nil, nil return nil, nil
} }
@ -377,17 +389,14 @@ func Wiki(ctx *context.Context) {
} }
wikiRepo, entry := renderViewPage(ctx) wikiRepo, entry := renderViewPage(ctx)
if ctx.Written() {
if wikiRepo != nil {
wikiRepo.Close()
}
return
}
defer func() { defer func() {
if wikiRepo != nil { if wikiRepo != nil {
wikiRepo.Close() wikiRepo.Close()
} }
}() }()
if ctx.Written() {
return
}
if entry == nil { if entry == nil {
ctx.Data["Title"] = ctx.Tr("repo.wiki") ctx.Data["Title"] = ctx.Tr("repo.wiki")
ctx.HTML(http.StatusOK, tplWikiStart) ctx.HTML(http.StatusOK, tplWikiStart)
@ -422,17 +431,15 @@ func WikiRevision(ctx *context.Context) {
} }
wikiRepo, entry := renderRevisionPage(ctx) wikiRepo, entry := renderRevisionPage(ctx)
if ctx.Written() {
if wikiRepo != nil {
wikiRepo.Close()
}
return
}
defer func() { defer func() {
if wikiRepo != nil { if wikiRepo != nil {
wikiRepo.Close() wikiRepo.Close()
} }
}() }()
if ctx.Written() {
return
}
if entry == nil { if entry == nil {
ctx.Data["Title"] = ctx.Tr("repo.wiki") ctx.Data["Title"] = ctx.Tr("repo.wiki")
ctx.HTML(http.StatusOK, tplWikiStart) ctx.HTML(http.StatusOK, tplWikiStart)
@ -469,13 +476,14 @@ func WikiPages(ctx *context.Context) {
} }
return return
} }
defer func() {
entries, err := commit.ListEntries()
if err != nil {
if wikiRepo != nil { if wikiRepo != nil {
wikiRepo.Close() wikiRepo.Close()
} }
}()
entries, err := commit.ListEntries()
if err != nil {
ctx.ServerError("ListEntries", err) ctx.ServerError("ListEntries", err)
return return
} }
@ -486,10 +494,6 @@ func WikiPages(ctx *context.Context) {
} }
c, err := wikiRepo.GetCommitByPath(entry.Name()) c, err := wikiRepo.GetCommitByPath(entry.Name())
if err != nil { if err != nil {
if wikiRepo != nil {
wikiRepo.Close()
}
ctx.ServerError("GetCommit", err) ctx.ServerError("GetCommit", err)
return return
} }
@ -498,10 +502,6 @@ func WikiPages(ctx *context.Context) {
if models.IsErrWikiInvalidFileName(err) { if models.IsErrWikiInvalidFileName(err) {
continue continue
} }
if wikiRepo != nil {
wikiRepo.Close()
}
ctx.ServerError("WikiFilenameToName", err) ctx.ServerError("WikiFilenameToName", err)
return return
} }
@ -513,21 +513,25 @@ func WikiPages(ctx *context.Context) {
} }
ctx.Data["Pages"] = pages ctx.Data["Pages"] = pages
defer func() {
if wikiRepo != nil {
wikiRepo.Close()
}
}()
ctx.HTML(http.StatusOK, tplWikiPages) ctx.HTML(http.StatusOK, tplWikiPages)
} }
// WikiRaw outputs raw blob requested by user (image for example) // WikiRaw outputs raw blob requested by user (image for example)
func WikiRaw(ctx *context.Context) { func WikiRaw(ctx *context.Context) {
wikiRepo, commit, err := findWikiRepoCommit(ctx) wikiRepo, commit, err := findWikiRepoCommit(ctx)
if err != nil { defer func() {
if wikiRepo != nil { if wikiRepo != nil {
wikiRepo.Close()
}
}()
if err != nil {
if git.IsErrNotExist(err) {
ctx.NotFound("findEntryForFile", nil)
return return
} }
ctx.ServerError("findEntryForfile", err)
return
} }
providedPath := ctx.Params("*") providedPath := ctx.Params("*")
@ -543,9 +547,7 @@ func WikiRaw(ctx *context.Context) {
if entry == nil { if entry == nil {
// Try to find a wiki page with that name // Try to find a wiki page with that name
if strings.HasSuffix(providedPath, ".md") { providedPath = strings.TrimSuffix(providedPath, ".md")
providedPath = providedPath[:len(providedPath)-3]
}
wikiPath := wiki_service.NameToFilename(providedPath) wikiPath := wiki_service.NameToFilename(providedPath)
entry, err = findEntryForFile(commit, wikiPath) entry, err = findEntryForFile(commit, wikiPath)