123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- // Copyright 2015 The Gogs Authors. All rights reserved.
- // Copyright 2017 The Gitea Authors. All rights reserved.
- // Use of this source code is governed by a MIT-style
- // license that can be found in the LICENSE file.
-
- //go:build !gogit
-
- 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
-
- batchCancel context.CancelFunc
- batchReader *bufio.Reader
- batchWriter WriteCloserError
-
- checkCancel context.CancelFunc
- checkReader *bufio.Reader
- checkWriter WriteCloserError
-
- Ctx context.Context
- }
-
- // 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")
- }
-
- // Now because of some insanity with git cat-file not immediately failing if not run in a valid git directory we need to run git rev-parse first!
- if err := EnsureValidGitRepository(ctx, repoPath); err != nil {
- return nil, err
- }
-
- repo := &Repository{
- Path: repoPath,
- tagCache: newObjectCache(),
- Ctx: ctx,
- }
-
- repo.batchWriter, repo.batchReader, repo.batchCancel = CatFileBatch(ctx, repoPath)
- repo.checkWriter, repo.checkReader, repo.checkCancel = CatFileBatchCheck(ctx, repo.Path)
-
- return repo, nil
- }
-
- // CatFileBatch obtains a CatFileBatch for this repository
- func (repo *Repository) CatFileBatch(ctx context.Context) (WriteCloserError, *bufio.Reader, func()) {
- if repo.batchCancel == nil || repo.batchReader.Buffered() > 0 {
- log.Debug("Opening temporary cat file batch for: %s", repo.Path)
- return CatFileBatch(ctx, repo.Path)
- }
- return repo.batchWriter, repo.batchReader, func() {}
- }
-
- // CatFileBatchCheck obtains a CatFileBatchCheck for this repository
- func (repo *Repository) CatFileBatchCheck(ctx context.Context) (WriteCloserError, *bufio.Reader, func()) {
- if repo.checkCancel == nil || repo.checkReader.Buffered() > 0 {
- log.Debug("Opening temporary cat file batch-check: %s", repo.Path)
- return CatFileBatchCheck(ctx, 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() (err error) {
- 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
- }
- return
- }
|