* Inital routes to git refs api * Git refs API implementation * Update swagger * Fix copyright * Make swagger happy add basic test * Fix test * Fix test again :)
64 lines
1.9 KiB
Go
64 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
|
|
}
|