mirror of
https://github.com/go-gitea/gitea.git
synced 2024-10-19 06:43:41 -04:00
65 lines
1.9 KiB
Go
65 lines
1.9 KiB
Go
|
package server
|
||
|
|
||
|
import (
|
||
|
"gopkg.in/src-d/go-git.v4/plumbing/cache"
|
||
|
"gopkg.in/src-d/go-git.v4/plumbing/storer"
|
||
|
"gopkg.in/src-d/go-git.v4/plumbing/transport"
|
||
|
"gopkg.in/src-d/go-git.v4/storage/filesystem"
|
||
|
|
||
|
"gopkg.in/src-d/go-billy.v4"
|
||
|
"gopkg.in/src-d/go-billy.v4/osfs"
|
||
|
)
|
||
|
|
||
|
// DefaultLoader is a filesystem loader ignoring host and resolving paths to /.
|
||
|
var DefaultLoader = NewFilesystemLoader(osfs.New(""))
|
||
|
|
||
|
// Loader loads repository's storer.Storer based on an optional host and a path.
|
||
|
type Loader interface {
|
||
|
// Load loads a storer.Storer given a transport.Endpoint.
|
||
|
// Returns transport.ErrRepositoryNotFound if the repository does not
|
||
|
// exist.
|
||
|
Load(ep *transport.Endpoint) (storer.Storer, error)
|
||
|
}
|
||
|
|
||
|
type fsLoader struct {
|
||
|
base billy.Filesystem
|
||
|
}
|
||
|
|
||
|
// NewFilesystemLoader creates a Loader that ignores host and resolves paths
|
||
|
// with a given base filesystem.
|
||
|
func NewFilesystemLoader(base billy.Filesystem) Loader {
|
||
|
return &fsLoader{base}
|
||
|
}
|
||
|
|
||
|
// Load looks up the endpoint's path in the base file system and returns a
|
||
|
// storer for it. Returns transport.ErrRepositoryNotFound if a repository does
|
||
|
// not exist in the given path.
|
||
|
func (l *fsLoader) Load(ep *transport.Endpoint) (storer.Storer, error) {
|
||
|
fs, err := l.base.Chroot(ep.Path)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
if _, err := fs.Stat("config"); err != nil {
|
||
|
return nil, transport.ErrRepositoryNotFound
|
||
|
}
|
||
|
|
||
|
return filesystem.NewStorage(fs, cache.NewObjectLRUDefault()), nil
|
||
|
}
|
||
|
|
||
|
// MapLoader is a Loader that uses a lookup map of storer.Storer by
|
||
|
// transport.Endpoint.
|
||
|
type MapLoader map[string]storer.Storer
|
||
|
|
||
|
// Load returns a storer.Storer for given a transport.Endpoint by looking it up
|
||
|
// in the map. Returns transport.ErrRepositoryNotFound if the endpoint does not
|
||
|
// exist.
|
||
|
func (l MapLoader) Load(ep *transport.Endpoint) (storer.Storer, error) {
|
||
|
s, ok := l[ep.String()]
|
||
|
if !ok {
|
||
|
return nil, transport.ErrRepositoryNotFound
|
||
|
}
|
||
|
|
||
|
return s, nil
|
||
|
}
|