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
// +build gogit
package git
import (
2021-11-30 23:06:32 +03:00
"context"
2020-12-17 17:00:47 +03:00
"errors"
"path/filepath"
gitealog "code.gitea.io/gitea/modules/log"
2021-06-30 23:58:45 +03:00
"code.gitea.io/gitea/modules/setting"
2020-12-17 17:00:47 +03:00
"github.com/go-git/go-billy/v5/osfs"
gogit "github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/plumbing/cache"
"github.com/go-git/go-git/v5/storage/filesystem"
)
// Repository represents a Git repository.
type Repository struct {
Path string
tagCache * ObjectCache
gogitRepo * gogit . Repository
gogitStorage * filesystem . Storage
gpgSettings * GPGSettings
2021-11-30 23:06:32 +03:00
Ctx context . Context
2020-12-17 17:00:47 +03:00
}
// OpenRepository opens the repository at the given path.
func OpenRepository ( repoPath string ) ( * Repository , error ) {
2021-11-30 23:06:32 +03:00
return OpenRepositoryCtx ( DefaultContext , repoPath )
}
// OpenRepositoryCtx opens the repository at the given path within the context.Context
func OpenRepositoryCtx ( 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" )
}
fs := osfs . New ( repoPath )
_ , err = fs . Stat ( ".git" )
if err == nil {
fs , err = fs . Chroot ( ".git" )
if err != nil {
return nil , err
}
}
2021-06-30 23:58:45 +03:00
storage := filesystem . NewStorageWithOptions ( fs , cache . NewObjectLRUDefault ( ) , filesystem . Options { KeepDescriptors : true , LargeObjectThreshold : setting . Git . LargeObjectThreshold } )
2020-12-17 17:00:47 +03:00
gogitRepo , err := gogit . Open ( storage , fs )
if err != nil {
return nil , err
}
return & Repository {
Path : repoPath ,
gogitRepo : gogitRepo ,
gogitStorage : storage ,
tagCache : newObjectCache ( ) ,
2021-11-30 23:06:32 +03:00
Ctx : ctx ,
2020-12-17 17:00:47 +03:00
} , nil
}
// Close this repository, in particular close the underlying gogitStorage if this is not nil
func ( repo * Repository ) Close ( ) {
if repo == nil || repo . gogitStorage == nil {
return
}
if err := repo . gogitStorage . Close ( ) ; err != nil {
gitealog . Error ( "Error closing storage: %v" , err )
}
}
// GoGitRepo gets the go-git repo representation
func ( repo * Repository ) GoGitRepo ( ) * gogit . Repository {
return repo . gogitRepo
}