Commit 72006bfe authored by Łukasz Magiera's avatar Łukasz Magiera

coreapi: asunc ls option

License: MIT
Signed-off-by: default avatarŁukasz Magiera <magik6k@gmail.com>
parent 93175e99
...@@ -42,7 +42,12 @@ type UnixfsAddSettings struct { ...@@ -42,7 +42,12 @@ type UnixfsAddSettings struct {
Progress bool Progress bool
} }
type UnixfsLsSettings struct {
Async bool
}
type UnixfsAddOption func(*UnixfsAddSettings) error type UnixfsAddOption func(*UnixfsAddSettings) error
type UnixfsLsOption func(*UnixfsLsSettings) error
func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, cid.Prefix, error) { func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, cid.Prefix, error) {
options := &UnixfsAddSettings{ options := &UnixfsAddSettings{
...@@ -122,6 +127,21 @@ func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, cid.Prefix, ...@@ -122,6 +127,21 @@ func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, cid.Prefix,
return options, prefix, nil return options, prefix, nil
} }
func UnixfsLsOptions(opts ...UnixfsLsOption) (*UnixfsLsSettings, error) {
options := &UnixfsLsSettings{
Async: true,
}
for _, opt := range opts {
err := opt(options)
if err != nil {
return nil, err
}
}
return options, nil
}
type unixfsOpts struct{} type unixfsOpts struct{}
var Unixfs unixfsOpts var Unixfs unixfsOpts
...@@ -290,3 +310,13 @@ func (unixfsOpts) Nocopy(enable bool) UnixfsAddOption { ...@@ -290,3 +310,13 @@ func (unixfsOpts) Nocopy(enable bool) UnixfsAddOption {
return nil return nil
} }
} }
// Async tells ls to return results as soon as they are available, which can be
// useful for listing HAMT directories. When this option is set to true returned
// results won't be returned in order
func (unixfsOpts) Async(async bool) UnixfsLsOption {
return func(settings *UnixfsLsSettings) error {
settings.Async = async
return nil
}
}
...@@ -749,12 +749,12 @@ func (tp *provider) TestLs(t *testing.T) { ...@@ -749,12 +749,12 @@ func (tp *provider) TestLs(t *testing.T) {
t.Error(err) t.Error(err)
} }
links, err := api.Unixfs().Ls(ctx, p) links, err := api.Unixfs().Ls(ctx, p, options.Unixfs.Async(false))
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }
link := <- links link := (<-links).Link
if link.Size != 23 { if link.Size != 23 {
t.Fatalf("expected size = 23, got %d", link.Size) t.Fatalf("expected size = 23, got %d", link.Size)
} }
...@@ -768,6 +768,24 @@ func (tp *provider) TestLs(t *testing.T) { ...@@ -768,6 +768,24 @@ func (tp *provider) TestLs(t *testing.T) {
t.Errorf("didn't expect a second link") t.Errorf("didn't expect a second link")
} }
links, err = api.Unixfs().Ls(ctx, p, options.Unixfs.Async(true))
if err != nil {
t.Error(err)
}
link = (<-links).Link
if link.Size != 23 {
t.Fatalf("expected size = 23, got %d", link.Size)
}
if link.Name != "name-of-file" {
t.Fatalf("expected name = name-of-file, got %s", link.Name)
}
if link.Cid.String() != "QmX3qQVKxDGz3URVC3861Z3CKtQKGBn6ffXRBBWGMFz9Lr" {
t.Fatalf("expected cid = QmX3qQVKxDGz3URVC3861Z3CKtQKGBn6ffXRBBWGMFz9Lr, got %s", link.Cid)
}
if _, ok := <-links; ok {
t.Errorf("didn't expect a second link")
}
} }
func (tp *provider) TestEntriesExpired(t *testing.T) { func (tp *provider) TestEntriesExpired(t *testing.T) {
......
...@@ -5,8 +5,8 @@ import ( ...@@ -5,8 +5,8 @@ import (
"github.com/ipfs/go-ipfs/core/coreapi/interface/options" "github.com/ipfs/go-ipfs/core/coreapi/interface/options"
ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" ft "gx/ipfs/QmQ1JnYpnzkaurjW1yxkQxC2w3K1PorNE1nv1vaP5Le7sq/go-unixfs"
files "gx/ipfs/QmaXvvAVAQ5ABqM5xtjYmV85xmN5MkWAZsX9H9Fwo4FVXp/go-ipfs-files" "gx/ipfs/QmaXvvAVAQ5ABqM5xtjYmV85xmN5MkWAZsX9H9Fwo4FVXp/go-ipfs-files"
) )
type AddEvent struct { type AddEvent struct {
...@@ -31,5 +31,5 @@ type UnixfsAPI interface { ...@@ -31,5 +31,5 @@ type UnixfsAPI interface {
Get(context.Context, Path) (files.Node, error) Get(context.Context, Path) (files.Node, error)
// Ls returns the list of links in a directory // Ls returns the list of links in a directory
Ls(context.Context, Path) (<-chan *ipld.Link, error) Ls(context.Context, Path, ...options.UnixfsLsOption) (<-chan ft.LinkResult, error)
} }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment