/
loader.go
94 lines (81 loc) · 2.67 KB
/
loader.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package loader
import (
"context"
"fmt"
golog "github.com/ipfs/go-log"
"github.com/qri-io/dataset"
"github.com/qri-io/qfs/cafs"
"github.com/qri-io/qri/base/dsfs"
"github.com/qri-io/qri/dscache"
"github.com/qri-io/qri/dsref"
"github.com/qri-io/qri/fsi"
"github.com/qri-io/qri/resolver"
)
var (
log = golog.Logger("loader")
)
var _ resolver.Resolver = (*DatasetResolver)(nil)
// DatasetResolver is a high-level component that can resolve dataset references
type DatasetResolver struct {
Dscache *dscache.Dscache
Store cafs.Filestore
}
// NewDatasetResolver returns a new DatasetResolver from dscache and a filestore
func NewDatasetResolver(d *dscache.Dscache, store cafs.Filestore) *DatasetResolver {
return &DatasetResolver{Dscache: d, Store: store}
}
// GetInfo looks up a VersionInfo from an initID
func (dr *DatasetResolver) GetInfo(initID string) *dsref.VersionInfo {
log.Errorf("TODO(dustmop): Implement me")
return nil
}
// GetInfoByDsref looks up a VersionInfo from a dataset ref
func (dr *DatasetResolver) GetInfoByDsref(ref dsref.Ref) *dsref.VersionInfo {
log.Errorf("TODO(dustmop): Implement me")
return nil
}
// LoadDsref will parse a ref string, resolve it using dscache and fsi, and return the dataset
// along with additional info.
// TODO(dustmop): Remove the info return value after fixing callers that currently rely on it
func (dr *DatasetResolver) LoadDsref(ctx context.Context, refstr string) (*dataset.Dataset, string, dsref.Ref, *dsref.VersionInfo, error) {
// Parse the refstr
ref, err := dsref.Parse(refstr)
if err == dsref.ErrBadCaseName {
log.Error(dsref.ErrBadCaseShouldRename)
} else if err != nil {
return nil, "", ref, nil, err
}
// Handle the "me" convenience shortcut
if ref.Username == "me" && dr.Dscache.DefaultUsername != "" {
ref.Username = dr.Dscache.DefaultUsername
}
// Resolve username to profileID, lookup dataset by profileID + prettyName
info, err := dr.Dscache.LookupByName(ref)
if err != nil {
return nil, "", ref, nil, fmt.Errorf("%w: %s", resolver.ErrCannotResolveName, err)
}
// Found a versionInfo, fill in ref.
ref.Name = info.Name
defaultPath := false
if ref.Path == "" {
ref.Path = info.Path
defaultPath = true
}
// Load the dataset head.
var ds *dataset.Dataset
if defaultPath && info.FSIPath != "" {
// Has an FSI Path, load from working directory
if ds, err = fsi.ReadDir(info.FSIPath); err != nil {
return nil, "", ref, nil, err
}
} else {
// Load from dsfs
if ds, err = dsfs.LoadDataset(ctx, dr.Store, ref.Path); err != nil {
return nil, "", ref, nil, err
}
}
// Set transient info on the returned dataset
ds.Name = ref.Name
ds.Peername = ref.Username
return ds, info.InitID, ref, info, err
}