2020-12-17 17:00:47 +03:00
// 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.
2021-08-24 19:47:09 +03:00
//go:build !gogit
2020-12-17 17:00:47 +03:00
package git
import (
2021-05-10 04:27:03 +03:00
"bufio"
"context"
2020-12-17 17:00:47 +03:00
"errors"
"path/filepath"
2021-06-25 19:54:08 +03:00
"code.gitea.io/gitea/modules/log"
2020-12-17 17:00:47 +03:00
)
// Repository represents a Git repository.
type Repository struct {
Path string
tagCache * ObjectCache
gpgSettings * GPGSettings
2021-05-10 04:27:03 +03:00
batchCancel context . CancelFunc
batchReader * bufio . Reader
batchWriter WriteCloserError
checkCancel context . CancelFunc
checkReader * bufio . Reader
checkWriter WriteCloserError
2021-11-30 23:06:32 +03:00
2022-07-25 18:39:42 +03:00
Ctx context . Context
LastCommitCache * LastCommitCache
2020-12-17 17:00:47 +03:00
}
2022-03-29 22:13:41 +03:00
// openRepositoryWithDefaultContext opens the repository at the given path with DefaultContext.
func openRepositoryWithDefaultContext ( repoPath string ) ( * Repository , error ) {
return OpenRepository ( DefaultContext , repoPath )
2021-11-30 23:06:32 +03:00
}
2022-03-29 22:13:41 +03:00
// OpenRepository opens the repository at the given path with the provided context.
func OpenRepository ( ctx context . Context , repoPath string ) ( * Repository , error ) {
2020-12-17 17:00:47 +03:00
repoPath , err := filepath . Abs ( repoPath )
if err != nil {
return nil , err
} else if ! isDir ( repoPath ) {
return nil , errors . New ( "no such file or directory" )
}
2021-05-10 04:27:03 +03:00
2021-12-16 22:01:14 +03:00
// 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
}
2021-05-10 04:27:03 +03:00
repo := & Repository {
2020-12-17 17:00:47 +03:00
Path : repoPath ,
tagCache : newObjectCache ( ) ,
2021-11-30 23:06:32 +03:00
Ctx : ctx ,
2021-05-10 04:27:03 +03:00
}
2021-11-30 23:06:32 +03:00
repo . batchWriter , repo . batchReader , repo . batchCancel = CatFileBatch ( ctx , repoPath )
repo . checkWriter , repo . checkReader , repo . checkCancel = CatFileBatchCheck ( ctx , repo . Path )
2021-05-10 04:27:03 +03:00
return repo , nil
}
// CatFileBatch obtains a CatFileBatch for this repository
2021-11-30 23:06:32 +03:00
func ( repo * Repository ) CatFileBatch ( ctx context . Context ) ( WriteCloserError , * bufio . Reader , func ( ) ) {
2021-05-10 04:27:03 +03:00
if repo . batchCancel == nil || repo . batchReader . Buffered ( ) > 0 {
2021-06-25 19:54:08 +03:00
log . Debug ( "Opening temporary cat file batch for: %s" , repo . Path )
2021-11-30 23:06:32 +03:00
return CatFileBatch ( ctx , repo . Path )
2021-05-10 04:27:03 +03:00
}
return repo . batchWriter , repo . batchReader , func ( ) { }
}
// CatFileBatchCheck obtains a CatFileBatchCheck for this repository
2021-11-30 23:06:32 +03:00
func ( repo * Repository ) CatFileBatchCheck ( ctx context . Context ) ( WriteCloserError , * bufio . Reader , func ( ) ) {
2021-05-10 04:27:03 +03:00
if repo . checkCancel == nil || repo . checkReader . Buffered ( ) > 0 {
2021-06-25 19:54:08 +03:00
log . Debug ( "Opening temporary cat file batch-check: %s" , repo . Path )
2021-11-30 23:06:32 +03:00
return CatFileBatchCheck ( ctx , repo . Path )
2021-05-10 04:27:03 +03:00
}
return repo . checkWriter , repo . checkReader , func ( ) { }
2020-12-17 17:00:47 +03:00
}
// Close this repository, in particular close the underlying gogitStorage if this is not nil
2022-01-20 02:26:57 +03:00
func ( repo * Repository ) Close ( ) ( err error ) {
2021-05-10 04:27:03 +03:00
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
}
2022-07-25 18:39:42 +03:00
repo . LastCommitCache = nil
repo . tagCache = nil
2022-06-20 13:02:49 +03:00
return err
2020-12-17 17:00:47 +03:00
}