mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-31 19:38:23 +00:00 
			
		
		
		
	On open repository open common cat file batch and batch-check (#15667)
Use common git cat-file --batch and git cat-file --batch-check to
significantly reduce calls to git.
    
Signed-off-by: Andrew Thornton <art27@cantab.net>
			
			
This commit is contained in:
		| @@ -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 | ||||
| 	} | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user