diff --git a/cli/parse.go b/cli/parse.go index 52aebe41..f1917f9c 100644 --- a/cli/parse.go +++ b/cli/parse.go @@ -216,7 +216,7 @@ func parseArgs(req *cmds.Request, root *cmds.Command, stdin *os.File) error { } stringArgs := make([]string, 0, numInputs) - fileArgs := make(map[string]files.File) + fileArgs := make(map[string]files.Node) // the index of the current argument definition iArgDef := 0 @@ -255,7 +255,7 @@ func parseArgs(req *cmds.Request, root *cmds.Command, stdin *os.File) error { // treat stringArg values as file paths fpath := inputs[0] inputs = inputs[1:] - var file files.File + var file files.Node if fpath == "-" { r, err := maybeWrapStdin(stdin, msgStdinInfo) if err != nil { @@ -422,7 +422,7 @@ func (st *parseState) parseLongOpt(optDefs map[string]cmdkit.Option) (string, in optval, err := parseOpt(k, v, optDefs) return k, optval, err } -func filesMapToSortedArr(fs map[string]files.File) []files.FileEntry { +func filesMapToSortedArr(fs map[string]files.Node) []files.DirEntry { var names []string for name, _ := range fs { names = append(names, name) @@ -430,9 +430,9 @@ func filesMapToSortedArr(fs map[string]files.File) []files.FileEntry { sort.Strings(names) - var out []files.FileEntry + var out []files.DirEntry for _, f := range names { - out = append(out, files.FileEntry{File: fs[f], Name: f}) + out = append(out, files.FileEntry(f, fs[f])) } return out @@ -455,7 +455,7 @@ func getArgDef(i int, argDefs []cmdkit.Argument) *cmdkit.Argument { const notRecursiveFmtStr = "'%s' is a directory, use the '-%s' flag to specify directories" const dirNotSupportedFmtStr = "invalid path '%s', argument '%s' does not support directories" -func appendFile(fpath string, argDef *cmdkit.Argument, recursive, hidden bool) (files.File, error) { +func appendFile(fpath string, argDef *cmdkit.Argument, recursive, hidden bool) (files.Node, error) { fpath = filepath.ToSlash(filepath.Clean(fpath)) if fpath == "." { cwd, err := os.Getwd() diff --git a/command.go b/command.go index 656eda15..b979492e 100644 --- a/command.go +++ b/command.go @@ -11,7 +11,6 @@ package cmds import ( "errors" "fmt" - "io" "strings" "github.com/ipfs/go-ipfs-cmdkit" @@ -229,16 +228,18 @@ func (c *Command) CheckArguments(req *Request) error { lastArg.Type == cmdkit.ArgString && req.Files != nil { - _, fi, err := req.Files.NextFile() - switch err { - case io.EOF: - case nil: - req.bodyArgs = newArguments(fi) + it, err := req.Files.Entries() + if err != nil { + return err + } + if it.Next() { + req.bodyArgs = newArguments(it.File()) // Can't pass files and stdin arguments. req.Files = nil - default: - // io error. - return err + } else { + if it.Err() != nil { + return it.Err() + } } } diff --git a/http/client.go b/http/client.go index f6813d7e..b6da288a 100644 --- a/http/client.go +++ b/http/client.go @@ -119,12 +119,16 @@ func (c *client) toHTTPRequest(req *cmds.Request) (*http.Request, error) { if bodyArgs := req.BodyArgs(); bodyArgs != nil { // In the end, this wraps a file reader in a file reader. // However, such is life. - fileReader = files.NewMultiFileReader(files.NewSliceFile([]files.FileEntry{ - {File: files.NewReaderFile(bodyArgs, nil), Name: "stdin"}, - }), true) + fileReader, err = files.NewMultiFileReader(files.NewSliceFile([]files.DirEntry{files.FileEntry("stdin", files.NewReaderFile(bodyArgs, nil))}), true) + if err != nil { + return nil, err + } reader = fileReader } else if req.Files != nil { - fileReader = files.NewMultiFileReader(req.Files, true) + fileReader, err = files.NewMultiFileReader(req.Files, true) + if err != nil { + return nil, err + } reader = fileReader } diff --git a/http/parse.go b/http/parse.go index 70ed8019..3c1c41d5 100644 --- a/http/parse.go +++ b/http/parse.go @@ -117,7 +117,7 @@ func parseRequest(ctx context.Context, r *http.Request, root *cmds.Command) (*cm contentType := r.Header.Get(contentTypeHeader) mediatype, _, _ := mime.ParseMediaType(contentType) - var f files.File + var f files.Directory if mediatype == "multipart/form-data" { reader, err := r.MultipartReader() if err != nil { diff --git a/request.go b/request.go index 504b5fbb..f1efc283 100644 --- a/request.go +++ b/request.go @@ -18,14 +18,14 @@ type Request struct { Arguments []string Options cmdkit.OptMap - Files files.File + Files files.Directory bodyArgs *arguments } // NewRequest returns a request initialized with given arguments // An non-nil error will be returned if the provided option values are invalid -func NewRequest(ctx context.Context, path []string, opts cmdkit.OptMap, args []string, file files.File, root *Command) (*Request, error) { +func NewRequest(ctx context.Context, path []string, opts cmdkit.OptMap, args []string, file files.Directory, root *Command) (*Request, error) { if opts == nil { opts = make(cmdkit.OptMap) }