2018-11-27 21:52:20 +00:00
|
|
|
// Package filesystem is a storage backend base on filesystems
|
|
|
|
package filesystem
|
|
|
|
|
|
|
|
import (
|
|
|
|
"gopkg.in/src-d/go-git.v4/plumbing/cache"
|
|
|
|
"gopkg.in/src-d/go-git.v4/storage/filesystem/dotgit"
|
|
|
|
|
|
|
|
"gopkg.in/src-d/go-billy.v4"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Storage is an implementation of git.Storer that stores data on disk in the
|
|
|
|
// standard git format (this is, the .git directory). Zero values of this type
|
|
|
|
// are not safe to use, see the NewStorage function below.
|
|
|
|
type Storage struct {
|
|
|
|
fs billy.Filesystem
|
|
|
|
dir *dotgit.DotGit
|
|
|
|
|
|
|
|
ObjectStorage
|
|
|
|
ReferenceStorage
|
|
|
|
IndexStorage
|
|
|
|
ShallowStorage
|
|
|
|
ConfigStorage
|
|
|
|
ModuleStorage
|
|
|
|
}
|
|
|
|
|
|
|
|
// Options holds configuration for the storage.
|
|
|
|
type Options struct {
|
|
|
|
// ExclusiveAccess means that the filesystem is not modified externally
|
|
|
|
// while the repo is open.
|
|
|
|
ExclusiveAccess bool
|
|
|
|
// KeepDescriptors makes the file descriptors to be reused but they will
|
|
|
|
// need to be manually closed calling Close().
|
|
|
|
KeepDescriptors bool
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewStorage returns a new Storage backed by a given `fs.Filesystem` and cache.
|
|
|
|
func NewStorage(fs billy.Filesystem, cache cache.Object) *Storage {
|
|
|
|
return NewStorageWithOptions(fs, cache, Options{})
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewStorageWithOptions returns a new Storage with extra options,
|
|
|
|
// backed by a given `fs.Filesystem` and cache.
|
|
|
|
func NewStorageWithOptions(fs billy.Filesystem, cache cache.Object, ops Options) *Storage {
|
|
|
|
dirOps := dotgit.Options{
|
|
|
|
ExclusiveAccess: ops.ExclusiveAccess,
|
|
|
|
KeepDescriptors: ops.KeepDescriptors,
|
|
|
|
}
|
|
|
|
dir := dotgit.NewWithOptions(fs, dirOps)
|
|
|
|
|
|
|
|
return &Storage{
|
|
|
|
fs: fs,
|
|
|
|
dir: dir,
|
|
|
|
|
2019-04-17 02:04:23 +00:00
|
|
|
ObjectStorage: *NewObjectStorageWithOptions(dir, cache, ops),
|
2018-11-27 21:52:20 +00:00
|
|
|
ReferenceStorage: ReferenceStorage{dir: dir},
|
|
|
|
IndexStorage: IndexStorage{dir: dir},
|
|
|
|
ShallowStorage: ShallowStorage{dir: dir},
|
|
|
|
ConfigStorage: ConfigStorage{dir: dir},
|
|
|
|
ModuleStorage: ModuleStorage{dir: dir},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Filesystem returns the underlying filesystem
|
|
|
|
func (s *Storage) Filesystem() billy.Filesystem {
|
|
|
|
return s.fs
|
|
|
|
}
|
|
|
|
|
|
|
|
// Init initializes .git directory
|
|
|
|
func (s *Storage) Init() error {
|
|
|
|
return s.dir.Initialize()
|
|
|
|
}
|