From eaf5e6df28702667b60bc61e19c273c96799154a Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 19 Mar 2025 11:02:01 -0700 Subject: [PATCH 1/6] avoid to create uncessary temporary cat file sub process --- modules/git/repo_base_nogogit.go | 1 + modules/git/repo_commit_nogogit.go | 10 +++++++--- modules/git/repo_tag_nogogit.go | 7 +++++-- routers/web/repo/view_file.go | 27 +++++++++++++++++---------- 4 files changed, 30 insertions(+), 15 deletions(-) diff --git a/modules/git/repo_base_nogogit.go b/modules/git/repo_base_nogogit.go index 477e3b8742976..9b250744bc0c2 100644 --- a/modules/git/repo_base_nogogit.go +++ b/modules/git/repo_base_nogogit.go @@ -76,6 +76,7 @@ func (repo *Repository) CatFileBatch(ctx context.Context) (WriteCloserError, *bu } log.Debug("Opening temporary cat file batch for: %s", repo.Path) + panic("lllllll") tempBatch, err := repo.NewBatch(ctx) if err != nil { return nil, nil, nil, err diff --git a/modules/git/repo_commit_nogogit.go b/modules/git/repo_commit_nogogit.go index 5aa0e9ec0457d..3ead3e22165f4 100644 --- a/modules/git/repo_commit_nogogit.go +++ b/modules/git/repo_commit_nogogit.go @@ -81,10 +81,10 @@ func (repo *Repository) getCommit(id ObjectID) (*Commit, error) { _, _ = wr.Write([]byte(id.String() + "\n")) - return repo.getCommitFromBatchReader(rd, id) + return repo.getCommitFromBatchReader(wr, rd, id) } -func (repo *Repository) getCommitFromBatchReader(rd *bufio.Reader, id ObjectID) (*Commit, error) { +func (repo *Repository) getCommitFromBatchReader(wr WriteCloserError, rd *bufio.Reader, id ObjectID) (*Commit, error) { _, typ, size, err := ReadBatchLine(rd) if err != nil { if errors.Is(err, io.EOF) || IsErrNotExist(err) { @@ -112,7 +112,11 @@ func (repo *Repository) getCommitFromBatchReader(rd *bufio.Reader, id ObjectID) return nil, err } - commit, err := tag.Commit(repo) + if _, err := wr.Write([]byte(tag.Object.String() + "\n")); err != nil { + return nil, err + } + + commit, err := repo.getCommitFromBatchReader(wr, rd, tag.Object) if err != nil { return nil, err } diff --git a/modules/git/repo_tag_nogogit.go b/modules/git/repo_tag_nogogit.go index e0a3104249ebc..3d2b4f52bde55 100644 --- a/modules/git/repo_tag_nogogit.go +++ b/modules/git/repo_tag_nogogit.go @@ -41,8 +41,11 @@ func (repo *Repository) GetTagType(id ObjectID) (string, error) { return "", err } _, typ, _, err := ReadBatchLine(rd) - if IsErrNotExist(err) { - return "", ErrNotExist{ID: id.String()} + if err != nil { + if IsErrNotExist(err) { + return "", ErrNotExist{ID: id.String()} + } + return "", err } return typ, nil } diff --git a/routers/web/repo/view_file.go b/routers/web/repo/view_file.go index 4ce7a8e3a4480..36b37cdf4ddf1 100644 --- a/routers/web/repo/view_file.go +++ b/routers/web/repo/view_file.go @@ -30,9 +30,26 @@ import ( "github.com/nektos/act/pkg/model" ) +func prepareLatestCommitInfo(ctx *context.Context) { + commit, err := ctx.Repo.Commit.GetCommitByPath(ctx.Repo.TreePath) + if err != nil { + ctx.ServerError("GetCommitByPath", err) + return + } + + if !loadLatestCommitData(ctx, commit) { + return + } +} + func prepareToRenderFile(ctx *context.Context, entry *git.TreeEntry) { ctx.Data["IsViewFile"] = true ctx.Data["HideRepoInfo"] = true + + prepareLatestCommitInfo(ctx) + + // Don't call any other repository functions until the dataRc closed to + // avoid create unnecessary temporary cat file. blob := entry.Blob() buf, dataRc, fInfo, err := getFileReader(ctx, ctx.Repo.Repository.ID, blob) if err != nil { @@ -46,16 +63,6 @@ func prepareToRenderFile(ctx *context.Context, entry *git.TreeEntry) { ctx.Data["FileName"] = blob.Name() ctx.Data["RawFileLink"] = ctx.Repo.RepoLink + "/raw/" + ctx.Repo.RefTypeNameSubURL() + "/" + util.PathEscapeSegments(ctx.Repo.TreePath) - commit, err := ctx.Repo.Commit.GetCommitByPath(ctx.Repo.TreePath) - if err != nil { - ctx.ServerError("GetCommitByPath", err) - return - } - - if !loadLatestCommitData(ctx, commit) { - return - } - if ctx.Repo.TreePath == ".editorconfig" { _, editorconfigWarning, editorconfigErr := ctx.Repo.GetEditorconfig(ctx.Repo.Commit) if editorconfigWarning != nil { From 8998913e99fce9a50b686ebd040427a77c298028 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 19 Mar 2025 11:06:56 -0700 Subject: [PATCH 2/6] Remove trace code --- modules/git/repo_base_nogogit.go | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/git/repo_base_nogogit.go b/modules/git/repo_base_nogogit.go index 9b250744bc0c2..477e3b8742976 100644 --- a/modules/git/repo_base_nogogit.go +++ b/modules/git/repo_base_nogogit.go @@ -76,7 +76,6 @@ func (repo *Repository) CatFileBatch(ctx context.Context) (WriteCloserError, *bu } log.Debug("Opening temporary cat file batch for: %s", repo.Path) - panic("lllllll") tempBatch, err := repo.NewBatch(ctx) if err != nil { return nil, nil, nil, err From c1712482611cfb996ca631ffd47bebc8b15bc337 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sat, 22 Mar 2025 18:08:13 -0700 Subject: [PATCH 3/6] Remove duplicated tag.Commit function and use repo.GetTagCommit --- modules/git/repo_tree_nogogit.go | 6 +++++- modules/git/tag.go | 5 ----- modules/repository/repo.go | 2 +- routers/api/v1/repo/tag.go | 2 +- services/repository/push.go | 2 +- 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/modules/git/repo_tree_nogogit.go b/modules/git/repo_tree_nogogit.go index d74769ccb2122..1954f8516219d 100644 --- a/modules/git/repo_tree_nogogit.go +++ b/modules/git/repo_tree_nogogit.go @@ -35,7 +35,11 @@ func (repo *Repository) getTree(id ObjectID) (*Tree, error) { if err != nil { return nil, err } - commit, err := tag.Commit(repo) + + if _, err := wr.Write([]byte(tag.Object.String() + "\n")); err != nil { + return nil, err + } + commit, err := repo.getCommitFromBatchReader(wr, rd, tag.Object) if err != nil { return nil, err } diff --git a/modules/git/tag.go b/modules/git/tag.go index f7666aa89b126..8bf3658d62fc1 100644 --- a/modules/git/tag.go +++ b/modules/git/tag.go @@ -21,11 +21,6 @@ type Tag struct { Signature *CommitSignature } -// Commit return the commit of the tag reference -func (tag *Tag) Commit(gitRepo *Repository) (*Commit, error) { - return gitRepo.getCommit(tag.Object) -} - func parsePayloadSignature(data []byte, messageStart int) (payload, msg, sign string) { pos := messageStart signStart, signEnd := -1, -1 diff --git a/modules/repository/repo.go b/modules/repository/repo.go index 97b0343381327..bc147a4dd55bc 100644 --- a/modules/repository/repo.go +++ b/modules/repository/repo.go @@ -126,7 +126,7 @@ func PushUpdateAddTag(ctx context.Context, repo *repo_model.Repository, gitRepo if err != nil { return fmt.Errorf("unable to GetTag: %w", err) } - commit, err := tag.Commit(gitRepo) + commit, err := gitRepo.GetTagCommit(tag.Name) if err != nil { return fmt.Errorf("unable to get tag Commit: %w", err) } diff --git a/routers/api/v1/repo/tag.go b/routers/api/v1/repo/tag.go index 2e6c1c1023552..e71c6fb4431c2 100644 --- a/routers/api/v1/repo/tag.go +++ b/routers/api/v1/repo/tag.go @@ -110,7 +110,7 @@ func GetAnnotatedTag(ctx *context.APIContext) { if tag, err := ctx.Repo.GitRepo.GetAnnotatedTag(sha); err != nil { ctx.APIError(http.StatusBadRequest, err) } else { - commit, err := tag.Commit(ctx.Repo.GitRepo) + commit, err := ctx.Repo.GitRepo.GetTagCommit(tag.Name) if err != nil { ctx.APIError(http.StatusBadRequest, err) } diff --git a/services/repository/push.go b/services/repository/push.go index 6d3b9dd252abc..d70da71ad8dd1 100644 --- a/services/repository/push.go +++ b/services/repository/push.go @@ -385,7 +385,7 @@ func pushUpdateAddTags(ctx context.Context, repo *repo_model.Repository, gitRepo if err != nil { return fmt.Errorf("GetTag: %w", err) } - commit, err := tag.Commit(gitRepo) + commit, err := gitRepo.GetTagCommit(tag.Name) if err != nil { return fmt.Errorf("Commit: %w", err) } From f685554a65e38450fa249766eae3a6300fc8fd3b Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 25 Mar 2025 00:06:56 -0700 Subject: [PATCH 4/6] Fix bug --- routers/web/repo/view_file.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/routers/web/repo/view_file.go b/routers/web/repo/view_file.go index 36b37cdf4ddf1..40f213fdd792e 100644 --- a/routers/web/repo/view_file.go +++ b/routers/web/repo/view_file.go @@ -30,23 +30,23 @@ import ( "github.com/nektos/act/pkg/model" ) -func prepareLatestCommitInfo(ctx *context.Context) { +func prepareLatestCommitInfo(ctx *context.Context) bool { commit, err := ctx.Repo.Commit.GetCommitByPath(ctx.Repo.TreePath) if err != nil { ctx.ServerError("GetCommitByPath", err) - return + return false } - if !loadLatestCommitData(ctx, commit) { - return - } + return loadLatestCommitData(ctx, commit) } func prepareToRenderFile(ctx *context.Context, entry *git.TreeEntry) { ctx.Data["IsViewFile"] = true ctx.Data["HideRepoInfo"] = true - prepareLatestCommitInfo(ctx) + if !prepareLatestCommitInfo(ctx) { + return + } // Don't call any other repository functions until the dataRc closed to // avoid create unnecessary temporary cat file. From ba1bac7968a302c6e34327f196617cdb34daf42f Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 27 Mar 2025 10:46:37 -0700 Subject: [PATCH 5/6] reduce unnecessary subprocess --- routers/web/repo/view_file.go | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/routers/web/repo/view_file.go b/routers/web/repo/view_file.go index 40f213fdd792e..168607dc6ac23 100644 --- a/routers/web/repo/view_file.go +++ b/routers/web/repo/view_file.go @@ -48,15 +48,7 @@ func prepareToRenderFile(ctx *context.Context, entry *git.TreeEntry) { return } - // Don't call any other repository functions until the dataRc closed to - // avoid create unnecessary temporary cat file. blob := entry.Blob() - buf, dataRc, fInfo, err := getFileReader(ctx, ctx.Repo.Repository.ID, blob) - if err != nil { - ctx.ServerError("getFileReader", err) - return - } - defer dataRc.Close() ctx.Data["Title"] = ctx.Tr("repo.file.title", ctx.Repo.Repository.Name+"/"+path.Base(ctx.Repo.TreePath), ctx.Repo.RefFullName.ShortName()) ctx.Data["FileIsSymlink"] = entry.IsLink() @@ -97,6 +89,15 @@ func prepareToRenderFile(ctx *context.Context, entry *git.TreeEntry) { isDisplayingSource := ctx.FormString("display") == "source" isDisplayingRendered := !isDisplayingSource + // Don't call any other repository functions with git.Repository until the dataRc closed to + // avoid create unnecessary temporary cat file. + buf, dataRc, fInfo, err := getFileReader(ctx, ctx.Repo.Repository.ID, blob) + if err != nil { + ctx.ServerError("getFileReader", err) + return + } + defer dataRc.Close() + if fInfo.isLFSFile { ctx.Data["RawFileLink"] = ctx.Repo.RepoLink + "/media/" + ctx.Repo.RefTypeNameSubURL() + "/" + util.PathEscapeSegments(ctx.Repo.TreePath) } From b0d0cc49fd31be6cdfa887bce5e5a64b3f4dd725 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 27 Mar 2025 10:46:53 -0700 Subject: [PATCH 6/6] reduce unnecessary subprocess --- routers/web/repo/view_file.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routers/web/repo/view_file.go b/routers/web/repo/view_file.go index 168607dc6ac23..3edba8e06e3e4 100644 --- a/routers/web/repo/view_file.go +++ b/routers/web/repo/view_file.go @@ -89,7 +89,7 @@ func prepareToRenderFile(ctx *context.Context, entry *git.TreeEntry) { isDisplayingSource := ctx.FormString("display") == "source" isDisplayingRendered := !isDisplayingSource - // Don't call any other repository functions with git.Repository until the dataRc closed to + // Don't call any other repository functions depends on git.Repository until the dataRc closed to // avoid create unnecessary temporary cat file. buf, dataRc, fInfo, err := getFileReader(ctx, ctx.Repo.Repository.ID, blob) if err != nil {