2016-12-12 00:28:47 +00:00
|
|
|
package tq
|
2016-08-09 21:43:29 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"sync"
|
|
|
|
|
2016-11-15 17:01:18 +00:00
|
|
|
"github.com/git-lfs/git-lfs/config"
|
2016-08-09 21:43:29 +00:00
|
|
|
"github.com/rubyist/tracerx"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Manifest struct {
|
2016-12-13 20:06:58 +00:00
|
|
|
// MaxRetries is the maximum number of retries a single object can
|
|
|
|
// attempt to make before it will be dropped.
|
2016-12-13 20:32:25 +00:00
|
|
|
MaxRetries int `git:"lfs.transfer.maxretries"`
|
|
|
|
ConcurrentTransfers int `git:"lfs.concurrenttransfers"`
|
2016-12-13 20:06:58 +00:00
|
|
|
|
2016-08-09 21:43:29 +00:00
|
|
|
basicTransfersOnly bool
|
2016-12-12 00:55:14 +00:00
|
|
|
downloadAdapterFuncs map[string]NewAdapterFunc
|
|
|
|
uploadAdapterFuncs map[string]NewAdapterFunc
|
2016-08-09 21:43:29 +00:00
|
|
|
mu sync.Mutex
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewManifest() *Manifest {
|
|
|
|
return &Manifest{
|
2016-12-12 00:55:14 +00:00
|
|
|
downloadAdapterFuncs: make(map[string]NewAdapterFunc),
|
|
|
|
uploadAdapterFuncs: make(map[string]NewAdapterFunc),
|
2016-08-09 21:43:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-08-09 22:07:41 +00:00
|
|
|
func ConfigureManifest(m *Manifest, cfg *config.Configuration) *Manifest {
|
2016-12-13 20:06:58 +00:00
|
|
|
if err := cfg.Unmarshal(m); err != nil {
|
|
|
|
tracerx.Printf("manifest: error parsing config, falling back to default values...: %v", err)
|
|
|
|
m.MaxRetries = 1
|
|
|
|
}
|
|
|
|
|
2016-12-13 20:32:25 +00:00
|
|
|
if cfg.NtlmAccess("download") {
|
|
|
|
m.ConcurrentTransfers = 1
|
|
|
|
}
|
|
|
|
|
2016-12-13 20:06:58 +00:00
|
|
|
if m.MaxRetries < 1 {
|
|
|
|
tracerx.Printf("manifest: invalid retry count: %d, defaulting to %d", m.MaxRetries, 1)
|
|
|
|
m.MaxRetries = 1
|
|
|
|
}
|
|
|
|
|
2016-08-09 21:43:29 +00:00
|
|
|
m.basicTransfersOnly = cfg.BasicTransfersOnly()
|
|
|
|
|
|
|
|
configureBasicDownloadAdapter(m)
|
|
|
|
configureBasicUploadAdapter(m)
|
|
|
|
if cfg.TusTransfersAllowed() {
|
|
|
|
configureTusAdapter(m)
|
|
|
|
}
|
2016-12-13 19:59:16 +00:00
|
|
|
configureCustomAdapters(cfg.Git, m)
|
2016-08-09 21:43:29 +00:00
|
|
|
return m
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetAdapterNames returns a list of the names of adapters available to be created
|
|
|
|
func (m *Manifest) GetAdapterNames(dir Direction) []string {
|
|
|
|
switch dir {
|
|
|
|
case Upload:
|
|
|
|
return m.GetUploadAdapterNames()
|
|
|
|
case Download:
|
|
|
|
return m.GetDownloadAdapterNames()
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetDownloadAdapterNames returns a list of the names of download adapters available to be created
|
|
|
|
func (m *Manifest) GetDownloadAdapterNames() []string {
|
|
|
|
return m.getAdapterNames(m.downloadAdapterFuncs)
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetUploadAdapterNames returns a list of the names of upload adapters available to be created
|
|
|
|
func (m *Manifest) GetUploadAdapterNames() []string {
|
|
|
|
return m.getAdapterNames(m.uploadAdapterFuncs)
|
|
|
|
}
|
|
|
|
|
2016-08-10 14:39:57 +00:00
|
|
|
// getAdapterNames returns a list of the names of adapters available to be created
|
2016-12-12 00:55:14 +00:00
|
|
|
func (m *Manifest) getAdapterNames(adapters map[string]NewAdapterFunc) []string {
|
2016-08-09 21:43:29 +00:00
|
|
|
if m.basicTransfersOnly {
|
|
|
|
return []string{BasicAdapterName}
|
|
|
|
}
|
|
|
|
|
|
|
|
m.mu.Lock()
|
|
|
|
defer m.mu.Unlock()
|
|
|
|
|
|
|
|
ret := make([]string, 0, len(adapters))
|
|
|
|
for n, _ := range adapters {
|
|
|
|
ret = append(ret, n)
|
|
|
|
}
|
|
|
|
return ret
|
|
|
|
}
|
|
|
|
|
|
|
|
// RegisterNewTransferAdapterFunc registers a new function for creating upload
|
|
|
|
// or download adapters. If a function with that name & direction is already
|
|
|
|
// registered, it is overridden
|
2016-12-12 00:55:14 +00:00
|
|
|
func (m *Manifest) RegisterNewAdapterFunc(name string, dir Direction, f NewAdapterFunc) {
|
2016-08-09 21:43:29 +00:00
|
|
|
m.mu.Lock()
|
|
|
|
defer m.mu.Unlock()
|
|
|
|
|
|
|
|
switch dir {
|
|
|
|
case Upload:
|
|
|
|
m.uploadAdapterFuncs[name] = f
|
|
|
|
case Download:
|
|
|
|
m.downloadAdapterFuncs[name] = f
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create a new adapter by name and direction; default to BasicAdapterName if doesn't exist
|
2016-12-12 00:55:14 +00:00
|
|
|
func (m *Manifest) NewAdapterOrDefault(name string, dir Direction) Adapter {
|
2016-08-09 21:43:29 +00:00
|
|
|
if len(name) == 0 {
|
|
|
|
name = BasicAdapterName
|
|
|
|
}
|
|
|
|
|
|
|
|
a := m.NewAdapter(name, dir)
|
|
|
|
if a == nil {
|
|
|
|
tracerx.Printf("Defaulting to basic transfer adapter since %q did not exist", name)
|
|
|
|
a = m.NewAdapter(BasicAdapterName, dir)
|
|
|
|
}
|
|
|
|
return a
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create a new adapter by name and direction, or nil if doesn't exist
|
2016-12-12 00:55:14 +00:00
|
|
|
func (m *Manifest) NewAdapter(name string, dir Direction) Adapter {
|
2016-08-09 21:43:29 +00:00
|
|
|
m.mu.Lock()
|
|
|
|
defer m.mu.Unlock()
|
|
|
|
|
|
|
|
switch dir {
|
|
|
|
case Upload:
|
|
|
|
if u, ok := m.uploadAdapterFuncs[name]; ok {
|
|
|
|
return u(name, dir)
|
|
|
|
}
|
|
|
|
case Download:
|
|
|
|
if d, ok := m.downloadAdapterFuncs[name]; ok {
|
|
|
|
return d(name, dir)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create a new download adapter by name, or BasicAdapterName if doesn't exist
|
2016-12-12 00:55:14 +00:00
|
|
|
func (m *Manifest) NewDownloadAdapter(name string) Adapter {
|
2016-08-09 21:43:29 +00:00
|
|
|
return m.NewAdapterOrDefault(name, Download)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create a new upload adapter by name, or BasicAdapterName if doesn't exist
|
2016-12-12 00:55:14 +00:00
|
|
|
func (m *Manifest) NewUploadAdapter(name string) Adapter {
|
2016-08-09 21:43:29 +00:00
|
|
|
return m.NewAdapterOrDefault(name, Upload)
|
|
|
|
}
|
2016-12-13 19:59:16 +00:00
|
|
|
|
|
|
|
type env interface {
|
|
|
|
Get(key string) (val string, ok bool)
|
|
|
|
Bool(key string, def bool) (val bool)
|
|
|
|
Int(key string, def int) (val int)
|
|
|
|
All() map[string]string
|
|
|
|
}
|