diff options
author | Filip Navara <filip.navara@gmail.com> | 2019-04-19 14:17:27 +0200 |
---|---|---|
committer | Lunny Xiao <xiaolunwen@gmail.com> | 2019-04-19 20:17:27 +0800 |
commit | 2af67f6044af1cad7136ce8c123e37ab090ca9bc (patch) | |
tree | 6eaa623db6a0665498d7f05c8bb1a4b4d7b141c7 /routers/repo | |
parent | 19ec2606e91610421a3e9cd87c94748ef07ca468 (diff) | |
download | gitea-2af67f6044af1cad7136ce8c123e37ab090ca9bc.tar.gz gitea-2af67f6044af1cad7136ce8c123e37ab090ca9bc.zip |
Improve listing performance by using go-git (#6478)
* Use go-git for tree reading and commit info lookup.
Signed-off-by: Filip Navara <navara@emclient.com>
* Use TreeEntry.IsRegular() instead of ObjectType that was removed.
Signed-off-by: Filip Navara <navara@emclient.com>
* Use the treePath to optimize commit info search.
Signed-off-by: Filip Navara <navara@emclient.com>
* Extract the latest commit at treePath along with the other commits.
Signed-off-by: Filip Navara <navara@emclient.com>
* Fix listing commit info for a directory that was created in one commit and never modified after.
Signed-off-by: Filip Navara <navara@emclient.com>
* Avoid nearly all external 'git' invocations when doing directory listing (.editorconfig code path is still hit).
Signed-off-by: Filip Navara <navara@emclient.com>
* Use go-git for reading blobs.
Signed-off-by: Filip Navara <navara@emclient.com>
* Make SHA1 type alias for plumbing.Hash in go-git.
Signed-off-by: Filip Navara <navara@emclient.com>
* Make Signature type alias for object.Signature in go-git.
Signed-off-by: Filip Navara <navara@emclient.com>
* Fix GetCommitsInfo for repository with only one commit.
Signed-off-by: Filip Navara <navara@emclient.com>
* Fix PGP signature verification.
Signed-off-by: Filip Navara <navara@emclient.com>
* Fix issues with walking commit graph across merges.
Signed-off-by: Filip Navara <navara@emclient.com>
* Fix typo in condition.
Signed-off-by: Filip Navara <navara@emclient.com>
* Speed up loading branch list by keeping the repository reference (and thus all the loaded packfile indexes).
Signed-off-by: Filip Navara <navara@emclient.com>
* Fix lising submodules.
Signed-off-by: Filip Navara <navara@emclient.com>
* Fix build
Signed-off-by: Filip Navara <navara@emclient.com>
* Add back commit cache because of name-rev
Signed-off-by: Filip Navara <navara@emclient.com>
* Fix tests
Signed-off-by: Filip Navara <navara@emclient.com>
* Fix code style
* Fix spelling
* Address PR feedback
Signed-off-by: Filip Navara <navara@emclient.com>
* Update vendor module list
Signed-off-by: Filip Navara <navara@emclient.com>
* Fix getting trees by commit id
Signed-off-by: Filip Navara <navara@emclient.com>
* Fix remaining unit test failures
* Fix GetTreeBySHA
* Avoid running `git name-rev` if not necessary
Signed-off-by: Filip Navara <navara@emclient.com>
* Move Branch code to git module
* Clean up GPG signature verification and fix it for tagged commits
* Address PR feedback (import formatting, copyright headers)
* Make blob lookup by SHA working
* Update tests to use public API
* Allow getting content from any type of object through the blob interface
* Change test to actually expect the object content that is in the GIT repository
* Change one more test to actually expect the object content that is in the GIT repository
* Add comments
Diffstat (limited to 'routers/repo')
-rw-r--r-- | routers/repo/commit.go | 1 | ||||
-rw-r--r-- | routers/repo/editor.go | 11 | ||||
-rw-r--r-- | routers/repo/issue.go | 5 | ||||
-rw-r--r-- | routers/repo/setting_protected_branch.go | 4 | ||||
-rw-r--r-- | routers/repo/view.go | 11 | ||||
-rw-r--r-- | routers/repo/wiki.go | 9 | ||||
-rw-r--r-- | routers/repo/wiki_test.go | 3 |
7 files changed, 20 insertions, 24 deletions
diff --git a/routers/repo/commit.go b/routers/repo/commit.go index a1e9b8bc5d..9263bcac7f 100644 --- a/routers/repo/commit.go +++ b/routers/repo/commit.go @@ -243,6 +243,7 @@ func Diff(ctx *context.Context) { ctx.Data["BeforeSourcePath"] = setting.AppSubURL + "/" + path.Join(userName, repoName, "src", "commit", parents[0]) } ctx.Data["RawPath"] = setting.AppSubURL + "/" + path.Join(userName, repoName, "raw", "commit", commitID) + ctx.Data["BranchName"], err = commit.GetBranchName() ctx.HTML(200, tplDiff) } diff --git a/routers/repo/editor.go b/routers/repo/editor.go index b5bb2f0ce3..4314218bf3 100644 --- a/routers/repo/editor.go +++ b/routers/repo/editor.go @@ -95,11 +95,12 @@ func editFile(ctx *context.Context, isNewFile bool) { return } - dataRc, err := blob.Data() + dataRc, err := blob.DataAsync() if err != nil { ctx.NotFound("blob.Data", err) return } + defer dataRc.Close() ctx.Data["FileSize"] = blob.Size() ctx.Data["FileName"] = blob.Name() @@ -251,9 +252,9 @@ func editFilePost(ctx *context.Context, form auth.EditRepoFileForm, isNewFile bo } else if models.IsErrRepoFileAlreadyExists(err) { ctx.Data["Err_TreePath"] = true ctx.RenderWithErr(ctx.Tr("repo.editor.file_already_exists", form.TreePath), tplEditFile, &form) - } else if models.IsErrBranchNotExist(err) { + } else if git.IsErrBranchNotExist(err) { // For when a user adds/updates a file to a branch that no longer exists - if branchErr, ok := err.(models.ErrBranchNotExist); ok { + if branchErr, ok := err.(git.ErrBranchNotExist); ok { ctx.RenderWithErr(ctx.Tr("repo.editor.branch_does_not_exist", branchErr.Name), tplEditFile, &form) } else { ctx.Error(500, err.Error()) @@ -417,9 +418,9 @@ func DeleteFilePost(ctx *context.Context, form auth.DeleteRepoFileForm) { } else { ctx.ServerError("DeleteRepoFile", err) } - } else if models.IsErrBranchNotExist(err) { + } else if git.IsErrBranchNotExist(err) { // For when a user deletes a file to a branch that no longer exists - if branchErr, ok := err.(models.ErrBranchNotExist); ok { + if branchErr, ok := err.(git.ErrBranchNotExist); ok { ctx.RenderWithErr(ctx.Tr("repo.editor.branch_does_not_exist", branchErr.Name), tplEditFile, &form) } else { ctx.Error(500, err.Error()) diff --git a/routers/repo/issue.go b/routers/repo/issue.go index 42f3ddf4e8..7d235d84ef 100644 --- a/routers/repo/issue.go +++ b/routers/repo/issue.go @@ -9,7 +9,6 @@ import ( "bytes" "errors" "fmt" - "io" "io/ioutil" "net/http" "strconv" @@ -363,7 +362,6 @@ func RetrieveRepoMetas(ctx *context.Context, repo *models.Repository) []*models. } func getFileContentFromDefaultBranch(ctx *context.Context, filename string) (string, bool) { - var r io.Reader var bytes []byte if ctx.Repo.Commit == nil { @@ -381,10 +379,11 @@ func getFileContentFromDefaultBranch(ctx *context.Context, filename string) (str if entry.Blob().Size() >= setting.UI.MaxDisplayFileSize { return "", false } - r, err = entry.Blob().Data() + r, err := entry.Blob().DataAsync() if err != nil { return "", false } + defer r.Close() bytes, err = ioutil.ReadAll(r) if err != nil { return "", false diff --git a/routers/repo/setting_protected_branch.go b/routers/repo/setting_protected_branch.go index 05ad0ec0ec..b5a115b6a4 100644 --- a/routers/repo/setting_protected_branch.go +++ b/routers/repo/setting_protected_branch.go @@ -103,7 +103,7 @@ func SettingsProtectedBranch(c *context.Context) { protectBranch, err := models.GetProtectedBranchBy(c.Repo.Repository.ID, branch) if err != nil { - if !models.IsErrBranchNotExist(err) { + if !git.IsErrBranchNotExist(err) { c.ServerError("GetProtectBranchOfRepoByName", err) return } @@ -152,7 +152,7 @@ func SettingsProtectedBranchPost(ctx *context.Context, f auth.ProtectBranchForm) protectBranch, err := models.GetProtectedBranchBy(ctx.Repo.Repository.ID, branch) if err != nil { - if !models.IsErrBranchNotExist(err) { + if !git.IsErrBranchNotExist(err) { ctx.ServerError("GetProtectBranchOfRepoByName", err) return } diff --git a/routers/repo/view.go b/routers/repo/view.go index e883ebbf89..d20f94dfba 100644 --- a/routers/repo/view.go +++ b/routers/repo/view.go @@ -49,7 +49,8 @@ func renderDirectory(ctx *context.Context, treeLink string) { } entries.CustomSort(base.NaturalSortLess) - ctx.Data["Files"], err = entries.GetCommitsInfo(ctx.Repo.Commit, ctx.Repo.TreePath, nil) + var latestCommit *git.Commit + ctx.Data["Files"], latestCommit, err = entries.GetCommitsInfo(ctx.Repo.Commit, ctx.Repo.TreePath, nil) if err != nil { ctx.ServerError("GetCommitsInfo", err) return @@ -178,14 +179,6 @@ func renderDirectory(ctx *context.Context, treeLink string) { // Show latest commit info of repository in table header, // or of directory if not in root directory. - latestCommit := ctx.Repo.Commit - if len(ctx.Repo.TreePath) > 0 { - latestCommit, err = ctx.Repo.Commit.GetCommitByPath(ctx.Repo.TreePath) - if err != nil { - ctx.ServerError("GetCommitByPath", err) - return - } - } ctx.Data["LatestCommit"] = latestCommit ctx.Data["LatestCommitVerification"] = models.ParseCommitWithSignature(latestCommit) ctx.Data["LatestCommitUser"] = models.ValidateCommitWithEmail(latestCommit) diff --git a/routers/repo/wiki.go b/routers/repo/wiki.go index 790214e8e5..c0fb370dd9 100644 --- a/routers/repo/wiki.go +++ b/routers/repo/wiki.go @@ -57,7 +57,7 @@ func findEntryForFile(commit *git.Commit, target string) (*git.TreeEntry, error) return nil, err } for _, entry := range entries { - if entry.Type == git.ObjectBlob && entry.Name() == target { + if entry.IsRegular() && entry.Name() == target { return entry, nil } } @@ -81,11 +81,12 @@ func findWikiRepoCommit(ctx *context.Context) (*git.Repository, *git.Commit, err // wikiContentsByEntry returns the contents of the wiki page referenced by the // given tree entry. Writes to ctx if an error occurs. func wikiContentsByEntry(ctx *context.Context, entry *git.TreeEntry) []byte { - reader, err := entry.Blob().Data() + reader, err := entry.Blob().DataAsync() if err != nil { ctx.ServerError("Blob.Data", err) return nil } + defer reader.Close() content, err := ioutil.ReadAll(reader) if err != nil { ctx.ServerError("ReadAll", err) @@ -125,7 +126,7 @@ func renderWikiPage(ctx *context.Context, isViewPage bool) (*git.Repository, *gi } pages := make([]PageMeta, 0, len(entries)) for _, entry := range entries { - if entry.Type != git.ObjectBlob { + if !entry.IsRegular() { continue } wikiName, err := models.WikiFilenameToName(entry.Name()) @@ -259,7 +260,7 @@ func WikiPages(ctx *context.Context) { } pages := make([]PageMeta, 0, len(entries)) for _, entry := range entries { - if entry.Type != git.ObjectBlob { + if !entry.IsRegular() { continue } c, err := wikiRepo.GetCommitByPath(entry.Name()) diff --git a/routers/repo/wiki_test.go b/routers/repo/wiki_test.go index 7302f9e48b..4687d24f6b 100644 --- a/routers/repo/wiki_test.go +++ b/routers/repo/wiki_test.go @@ -40,8 +40,9 @@ func wikiContent(t *testing.T, repo *models.Repository, wikiName string) string if !assert.NotNil(t, entry) { return "" } - reader, err := entry.Blob().Data() + reader, err := entry.Blob().DataAsync() assert.NoError(t, err) + defer reader.Close() bytes, err := ioutil.ReadAll(reader) assert.NoError(t, err) return string(bytes) |