diff options
Diffstat (limited to 'modules/git/repo_base_nogogit.go')
-rw-r--r-- | modules/git/repo_base_nogogit.go | 53 |
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 + } } |