mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-29 17:04:27 +01:00
0ca13c5eae
When opening a repository, it will call `ensureValidRepository` and also `CatFileBatch`. But sometimes these will not be used until repository closed. So it's a waste of CPU to invoke 3 times git command for every open repository. This PR removed all of these from `OpenRepository` but only kept checking whether the folder exists. When a batch is necessary, the necessary functions will be invoked. --- Conflict resolution: Because of the removal of go-git in (#4941) `_nogogit.go` files were either renamed or merged into the 'common' file. Git does handle the renames correctly, but for those that were merged has to be manually copied pasted over. The patch looks the same, 201 additions 90 deletions as the original patch. (cherry picked from commit c03baab678ba5b2e9d974aea147e660417f5d3f7)
124 lines
2.9 KiB
Go
124 lines
2.9 KiB
Go
// Copyright 2015 The Gogs Authors. All rights reserved.
|
|
// Copyright 2017 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package git
|
|
|
|
import (
|
|
"bufio"
|
|
"context"
|
|
"errors"
|
|
"path/filepath"
|
|
|
|
"code.gitea.io/gitea/modules/log"
|
|
)
|
|
|
|
// Repository represents a Git repository.
|
|
type Repository struct {
|
|
Path string
|
|
|
|
tagCache *ObjectCache
|
|
|
|
gpgSettings *GPGSettings
|
|
|
|
batchInUse bool
|
|
batch *Batch
|
|
|
|
checkInUse bool
|
|
check *Batch
|
|
|
|
Ctx context.Context
|
|
LastCommitCache *LastCommitCache
|
|
|
|
objectFormat ObjectFormat
|
|
}
|
|
|
|
// openRepositoryWithDefaultContext opens the repository at the given path with DefaultContext.
|
|
func openRepositoryWithDefaultContext(repoPath string) (*Repository, error) {
|
|
return OpenRepository(DefaultContext, repoPath)
|
|
}
|
|
|
|
// OpenRepository opens the repository at the given path with the provided context.
|
|
func OpenRepository(ctx context.Context, repoPath string) (*Repository, error) {
|
|
repoPath, err := filepath.Abs(repoPath)
|
|
if err != nil {
|
|
return nil, err
|
|
} else if !isDir(repoPath) {
|
|
return nil, errors.New("no such file or directory")
|
|
}
|
|
|
|
return &Repository{
|
|
Path: repoPath,
|
|
tagCache: newObjectCache(),
|
|
Ctx: ctx,
|
|
}, nil
|
|
}
|
|
|
|
// CatFileBatch obtains a CatFileBatch for this repository
|
|
func (repo *Repository) CatFileBatch(ctx context.Context) (WriteCloserError, *bufio.Reader, func(), error) {
|
|
if repo.batch == nil {
|
|
var err error
|
|
repo.batch, err = repo.NewBatch(ctx)
|
|
if err != nil {
|
|
return nil, nil, nil, err
|
|
}
|
|
}
|
|
|
|
if !repo.batchInUse {
|
|
repo.batchInUse = true
|
|
return repo.batch.Writer, repo.batch.Reader, func() {
|
|
repo.batchInUse = false
|
|
}, nil
|
|
}
|
|
|
|
log.Debug("Opening temporary cat file batch for: %s", repo.Path)
|
|
tempBatch, err := repo.NewBatch(ctx)
|
|
if err != nil {
|
|
return nil, nil, nil, err
|
|
}
|
|
return tempBatch.Writer, tempBatch.Reader, tempBatch.Close, nil
|
|
}
|
|
|
|
// CatFileBatchCheck obtains a CatFileBatchCheck for this repository
|
|
func (repo *Repository) CatFileBatchCheck(ctx context.Context) (WriteCloserError, *bufio.Reader, func(), error) {
|
|
if repo.check == nil {
|
|
var err error
|
|
repo.check, err = repo.NewBatchCheck(ctx)
|
|
if err != nil {
|
|
return nil, nil, nil, err
|
|
}
|
|
}
|
|
|
|
if !repo.checkInUse {
|
|
repo.checkInUse = true
|
|
return repo.check.Writer, repo.check.Reader, func() {
|
|
repo.checkInUse = false
|
|
}, nil
|
|
}
|
|
|
|
log.Debug("Opening temporary cat file batch-check for: %s", repo.Path)
|
|
tempBatchCheck, err := repo.NewBatchCheck(ctx)
|
|
if err != nil {
|
|
return nil, nil, nil, err
|
|
}
|
|
return tempBatchCheck.Writer, tempBatchCheck.Reader, tempBatchCheck.Close, nil
|
|
}
|
|
|
|
func (repo *Repository) Close() error {
|
|
if repo == nil {
|
|
return nil
|
|
}
|
|
if repo.batch != nil {
|
|
repo.batch.Close()
|
|
repo.batch = nil
|
|
repo.batchInUse = false
|
|
}
|
|
if repo.check != nil {
|
|
repo.check.Close()
|
|
repo.check = nil
|
|
repo.checkInUse = false
|
|
}
|
|
repo.LastCommitCache = nil
|
|
repo.tagCache = nil
|
|
return nil
|
|
}
|