mirror of
https://github.com/go-gitea/gitea.git
synced 2026-07-23 01:09:57 +02:00
refactor: decouple git.Repository(ctx) from git.Commit & git.Tree (#38464)
1. Storing "ctx" in a long-living object is wrong 2. Make the commit & tree cacheable (for the future performance optimization) 3. Also fix some bad designs like `// FIXME: bad design, this field can be nil if the commit is from "last commit cache"` ref: * #33893
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
package template
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"path"
|
||||
"strconv"
|
||||
@@ -41,35 +42,35 @@ func Unmarshal(filename string, content []byte) (*api.IssueTemplate, error) {
|
||||
}
|
||||
|
||||
// UnmarshalFromEntry parses out a valid template from the blob in entry
|
||||
func UnmarshalFromEntry(entry *git.TreeEntry, dir string) (*api.IssueTemplate, error) {
|
||||
return unmarshalFromEntry(entry, path.Join(dir, entry.Name())) // Filepaths in Git are ALWAYS '/' separated do not use filepath here
|
||||
func UnmarshalFromEntry(gitRepo *git.Repository, entry *git.TreeEntry, dir string) (*api.IssueTemplate, error) {
|
||||
return unmarshalFromEntry(gitRepo, entry, path.Join(dir, entry.Name())) // Filepaths in Git are ALWAYS '/' separated do not use filepath here
|
||||
}
|
||||
|
||||
// UnmarshalFromCommit parses out a valid template from the commit
|
||||
func UnmarshalFromCommit(commit *git.Commit, filename string) (*api.IssueTemplate, error) {
|
||||
entry, err := commit.GetTreeEntryByPath(filename)
|
||||
func UnmarshalFromCommit(ctx context.Context, gitRepo *git.Repository, commit *git.Commit, filename string) (*api.IssueTemplate, error) {
|
||||
entry, err := commit.GetTreeEntryByPath(ctx, gitRepo, filename)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("get entry for %q: %w", filename, err)
|
||||
}
|
||||
return unmarshalFromEntry(entry, filename)
|
||||
return unmarshalFromEntry(gitRepo, entry, filename)
|
||||
}
|
||||
|
||||
// UnmarshalFromRepo parses out a valid template from the head commit of the branch
|
||||
func UnmarshalFromRepo(repo *git.Repository, branch, filename string) (*api.IssueTemplate, error) {
|
||||
func UnmarshalFromRepo(ctx context.Context, repo *git.Repository, branch, filename string) (*api.IssueTemplate, error) {
|
||||
commit, err := repo.GetBranchCommit(branch)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("get commit on branch %q: %w", branch, err)
|
||||
}
|
||||
|
||||
return UnmarshalFromCommit(commit, filename)
|
||||
return UnmarshalFromCommit(ctx, repo, commit, filename)
|
||||
}
|
||||
|
||||
func unmarshalFromEntry(entry *git.TreeEntry, filename string) (*api.IssueTemplate, error) {
|
||||
if size := entry.Blob().Size(); size > setting.UI.MaxDisplayFileSize {
|
||||
func unmarshalFromEntry(gitRepo *git.Repository, entry *git.TreeEntry, filename string) (*api.IssueTemplate, error) {
|
||||
if size := entry.Blob(gitRepo).Size(); size > setting.UI.MaxDisplayFileSize {
|
||||
return nil, fmt.Errorf("too large: %v > MaxDisplayFileSize", size)
|
||||
}
|
||||
|
||||
r, err := entry.Blob().DataAsync()
|
||||
r, err := entry.Blob(gitRepo).DataAsync()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("data async: %w", err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user