Skip to content

Commit

Permalink
feat(add): add link flag to lib.Add, CLI, API
Browse files Browse the repository at this point in the history
This allows adding a dataset & linking it to a directory in the same command
  • Loading branch information
b5 committed Sep 25, 2019
1 parent df70d5c commit 61984f6
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 17 deletions.
8 changes: 7 additions & 1 deletion api/datasets.go
Original file line number Diff line number Diff line change
Expand Up @@ -364,13 +364,19 @@ func (h *DatasetHandlers) addHandler(w http.ResponseWriter, r *http.Request) {
return
}

// TODO (b5) - move this into lib.Add
if ref.Peername == "" || ref.Name == "" {
util.WriteErrResponse(w, http.StatusBadRequest, fmt.Errorf("need peername and dataset name: '/add/[peername]/[datasetname]'"))
return
}

p := &lib.AddParams{
Ref: ref.String(),
LinkDir: r.FormValue("dir"),
}

res := repo.DatasetRef{}
err = h.Add(&ref, &res)
err = h.Add(p, &res)
if err != nil {
util.WriteErrResponse(w, http.StatusInternalServerError, err)
return
Expand Down
26 changes: 21 additions & 5 deletions cmd/add.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package cmd

import (
"fmt"
"path/filepath"

"github.com/qri-io/ioes"
"github.com/qri-io/qri/lib"
Expand Down Expand Up @@ -35,12 +36,15 @@ the name of the peer that originally added the dataset. You must have
},
}

cmd.Flags().StringVar(&o.LinkDir, "link", "", "path to directory to link dataset to")

return cmd
}

// AddOptions encapsulates state for the add command
type AddOptions struct {
ioes.IOStreams
LinkDir string
DatasetRequests *lib.DatasetRequests
}

Expand All @@ -57,20 +61,32 @@ func (o *AddOptions) Run(args []string) error {
o.StartSpinner()
defer o.StopSpinner()

if len(args) > 1 && o.LinkDir != "" {
return fmt.Errorf("link flag can only be used with a single reference")
}

for _, arg := range args {
ref, err := parseCmdLineDatasetRef(arg)
if err != nil {
return err
if o.LinkDir != "" {
abs, err := filepath.Abs(o.LinkDir)
if err != nil {
return err
}
o.LinkDir = abs
}

p := &lib.AddParams{
Ref: arg,
LinkDir: o.LinkDir,
}

res := repo.DatasetRef{}
if err = o.DatasetRequests.Add(&ref, &res); err != nil {
if err := o.DatasetRequests.Add(p, &res); err != nil {
return err
}

refStr := refStringer(res)
fmt.Fprintf(o.Out, "\n%s", refStr.String())
printInfo(o.Out, "Successfully added dataset %s", ref)
printInfo(o.Out, "Successfully added dataset %s", arg)
}

return nil
Expand Down
43 changes: 35 additions & 8 deletions lib/datasets.go
Original file line number Diff line number Diff line change
Expand Up @@ -614,21 +614,48 @@ func (r *DatasetRequests) Remove(p *RemoveParams, res *RemoveResponse) error {
return nil
}

// AddParams encapsulates parameters to the add command
type AddParams struct {
Ref string
LinkDir string
RemoteAddr string // remote to attempt to pull from
}

// Add adds an existing dataset to a peer's repository
func (r *DatasetRequests) Add(ref *repo.DatasetRef, res *repo.DatasetRef) (err error) {
func (r *DatasetRequests) Add(p *AddParams, res *repo.DatasetRef) (err error) {
if r.cli != nil {
return r.cli.Call("DatasetRequests.Add", ref, res)
return r.cli.Call("DatasetRequests.Add", p, res)
}
ctx := context.TODO()

defaultAddr := ""
if r.inst != nil && r.inst.cfg.Registry != nil {
defaultAddr = r.inst.cfg.Registry.Location
ref, err := repo.ParseDatasetRef(p.Ref)
if err != nil {
return err
}

if p.RemoteAddr == "" && r.inst != nil && r.inst.cfg.Registry != nil {
p.RemoteAddr = r.inst.cfg.Registry.Location
}

err = actions.AddDataset(ctx, r.node, r.inst.RemoteClient(), defaultAddr, ref)
*res = *ref
return err
if err = actions.AddDataset(ctx, r.node, r.inst.RemoteClient(), p.RemoteAddr, &ref); err != nil {
return err
}

*res = ref

if p.LinkDir != "" {
checkoutp := &CheckoutParams{
Ref: ref.String(),
Dir: p.LinkDir,
}
m := NewFSIMethods(r.inst)
checkoutRes := ""
if err = m.Checkout(checkoutp, &checkoutRes); err != nil {
return err
}
}

return nil
}

// ValidateDatasetParams defines parameters for dataset
Expand Down
9 changes: 6 additions & 3 deletions lib/datasets_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -767,11 +767,11 @@ func TestDatasetRequestsRemove(t *testing.T) {

func TestDatasetRequestsAdd(t *testing.T) {
cases := []struct {
p *repo.DatasetRef
p *AddParams
res *repo.DatasetRef
err string
}{
{&repo.DatasetRef{Name: "abc", Path: "hash###"}, nil, "node is not online and no registry is configured"},
{&AddParams{Ref: "abc/hash###"}, nil, "node is not online and no registry is configured"},
}

mr, err := testrepo.NewTestRepo()
Expand Down Expand Up @@ -842,12 +842,15 @@ func TestDatasetRequestsAddP2P(t *testing.T) {
index, _ := strconv.ParseInt(num, 10, 32)
name := datasets[index]
ref := repo.DatasetRef{Peername: profile.Peername, Name: name}
p := &AddParams{
Ref: ref.AliasString(),
}

// Build requests for peer1 to peer2.
dsr := NewDatasetRequests(p0, nil)
got := &repo.DatasetRef{}

err := dsr.Add(&ref, got)
err := dsr.Add(p, got)
if err != nil {
pro1, _ := p0.Repo.Profile()
pro2, _ := p1.Repo.Profile()
Expand Down

0 comments on commit 61984f6

Please sign in to comment.