summaryrefslogtreecommitdiffstats
path: root/modules/git/repo_base_nogogit.go
diff options
context:
space:
mode:
Diffstat (limited to 'modules/git/repo_base_nogogit.go')
-rw-r--r--modules/git/repo_base_nogogit.go53
1 files changed, 51 insertions, 2 deletions
diff --git a/modules/git/repo_base_nogogit.go b/modules/git/repo_base_nogogit.go
index e05219a4e7..c7d6019d77 100644
--- a/modules/git/repo_base_nogogit.go
+++ b/modules/git/repo_base_nogogit.go
@@ -8,6 +8,8 @@
package git
import (
+ "bufio"
+ "context"
"errors"
"path/filepath"
)
@@ -19,6 +21,14 @@ type Repository struct {
tagCache *ObjectCache
gpgSettings *GPGSettings
+
+ batchCancel context.CancelFunc
+ batchReader *bufio.Reader
+ batchWriter WriteCloserError
+
+ checkCancel context.CancelFunc
+ checkReader *bufio.Reader
+ checkWriter WriteCloserError
}
// OpenRepository opens the repository at the given path.
@@ -29,12 +39,51 @@ func OpenRepository(repoPath string) (*Repository, error) {
} else if !isDir(repoPath) {
return nil, errors.New("no such file or directory")
}
- return &Repository{
+
+ repo := &Repository{
Path: repoPath,
tagCache: newObjectCache(),
- }, nil
+ }
+
+ repo.batchWriter, repo.batchReader, repo.batchCancel = CatFileBatch(repoPath)
+ repo.checkWriter, repo.checkReader, repo.checkCancel = CatFileBatchCheck(repo.Path)
+
+ return repo, nil
+}
+
+// CatFileBatch obtains a CatFileBatch for this repository
+func (repo *Repository) CatFileBatch() (WriteCloserError, *bufio.Reader, func()) {
+ if repo.batchCancel == nil || repo.batchReader.Buffered() > 0 {
+ log("Opening temporary cat file batch for: %s", repo.Path)
+ return CatFileBatch(repo.Path)
+ }
+ return repo.batchWriter, repo.batchReader, func() {}
+}
+
+// CatFileBatchCheck obtains a CatFileBatchCheck for this repository
+func (repo *Repository) CatFileBatchCheck() (WriteCloserError, *bufio.Reader, func()) {
+ if repo.checkCancel == nil || repo.checkReader.Buffered() > 0 {
+ log("Opening temporary cat file batch-check: %s", repo.Path)
+ return CatFileBatchCheck(repo.Path)
+ }
+ return repo.checkWriter, repo.checkReader, func() {}
}
// Close this repository, in particular close the underlying gogitStorage if this is not nil
func (repo *Repository) Close() {
+ if repo == nil {
+ return
+ }
+ if repo.batchCancel != nil {
+ repo.batchCancel()
+ repo.batchReader = nil
+ repo.batchWriter = nil
+ repo.batchCancel = nil
+ }
+ if repo.checkCancel != nil {
+ repo.checkCancel()
+ repo.checkCancel = nil
+ repo.checkReader = nil
+ repo.checkWriter = nil
+ }
}