Skip to content

Commit

Permalink
Move "add" functionality into new file
Browse files Browse the repository at this point in the history
  • Loading branch information
adamgall committed Nov 14, 2018
1 parent 5271578 commit a9ce617
Show file tree
Hide file tree
Showing 2 changed files with 114 additions and 101 deletions.
114 changes: 114 additions & 0 deletions add.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
package shell

import (
"context"
"encoding/json"
"errors"
"io"
"io/ioutil"
"os"
"path"

files "github.com/ipfs/go-ipfs-files"
)

type object struct {
Hash string
}

// Add a file to ipfs from the given reader, returns the hash of the added file
func (s *Shell) Add(r io.Reader) (string, error) {
return s.AddWithOpts(r, true, false, false)
}

// AddOnlyHash returns the hash of the file without adding it to ipfs
func (s *Shell) AddOnlyHash(r io.Reader) (string, error) {
return s.AddWithOpts(r, true, false, true)
}

// AddNoPin a file to ipfs from the given reader, returns the hash of the added file without pinning the file
func (s *Shell) AddNoPin(r io.Reader) (string, error) {
return s.AddWithOpts(r, false, false, false)
}

func (s *Shell) AddWithOpts(r io.Reader, pin bool, rawLeaves bool, onlyHash bool) (string, error) {
var rc io.ReadCloser
if rclose, ok := r.(io.ReadCloser); ok {
rc = rclose
} else {
rc = ioutil.NopCloser(r)
}

// handler expects an array of files
fr := files.NewReaderFile("", "", rc, nil)
slf := files.NewSliceFile("", "", []files.File{fr})
fileReader := files.NewMultiFileReader(slf, true)

var out object
return out.Hash, s.Request("add").
Option("progress", false).
Option("pin", pin).
Option("raw-leaves", rawLeaves).
Option("only-hash", onlyHash).
Body(fileReader).
Exec(context.Background(), &out)
}

func (s *Shell) AddLink(target string) (string, error) {
link := files.NewLinkFile("", "", target, nil)
slf := files.NewSliceFile("", "", []files.File{link})
reader := files.NewMultiFileReader(slf, true)

var out object
return out.Hash, s.Request("add").Body(reader).Exec(context.Background(), &out)
}

// AddDir adds a directory recursively with all of the files under it
func (s *Shell) AddDir(dir string) (string, error) {
stat, err := os.Lstat(dir)
if err != nil {
return "", err
}

sf, err := files.NewSerialFile(path.Base(dir), dir, false, stat)
if err != nil {
return "", err
}
slf := files.NewSliceFile("", dir, []files.File{sf})
reader := files.NewMultiFileReader(slf, true)

resp, err := s.Request("add").
Option("recursive", true).
Body(reader).
Send(context.Background())

if err != nil {
return "", nil
}

defer resp.Close()

if resp.Error != nil {
return "", resp.Error
}

dec := json.NewDecoder(resp.Output)
var final string
for {
var out object
err = dec.Decode(&out)
if err != nil {
if err == io.EOF {
break
}
return "", err
}
final = out.Hash
}

if final == "" {
return "", errors.New("no results received")
}

return final, nil
}
101 changes: 0 additions & 101 deletions shell.go
Original file line number Diff line number Diff line change
Expand Up @@ -135,107 +135,6 @@ func (s *Shell) Cat(path string) (io.ReadCloser, error) {
return resp.Output, nil
}

type object struct {
Hash string
}

// Add a file to ipfs from the given reader, returns the hash of the added file
func (s *Shell) Add(r io.Reader) (string, error) {
return s.AddWithOpts(r, true, false, false)
}

// AddOnlyHash returns the hash of the file without adding it to ipfs
func (s *Shell) AddOnlyHash(r io.Reader) (string, error) {
return s.AddWithOpts(r, true, false, true)
}

// AddNoPin a file to ipfs from the given reader, returns the hash of the added file without pinning the file
func (s *Shell) AddNoPin(r io.Reader) (string, error) {
return s.AddWithOpts(r, false, false, false)
}

func (s *Shell) AddWithOpts(r io.Reader, pin bool, rawLeaves bool, onlyHash bool) (string, error) {
var rc io.ReadCloser
if rclose, ok := r.(io.ReadCloser); ok {
rc = rclose
} else {
rc = ioutil.NopCloser(r)
}

// handler expects an array of files
fr := files.NewReaderFile("", "", rc, nil)
slf := files.NewSliceFile("", "", []files.File{fr})
fileReader := files.NewMultiFileReader(slf, true)

var out object
return out.Hash, s.Request("add").
Option("progress", false).
Option("pin", pin).
Option("raw-leaves", rawLeaves).
Option("only-hash", onlyHash).
Body(fileReader).
Exec(context.Background(), &out)
}

func (s *Shell) AddLink(target string) (string, error) {
link := files.NewLinkFile("", "", target, nil)
slf := files.NewSliceFile("", "", []files.File{link})
reader := files.NewMultiFileReader(slf, true)

var out object
return out.Hash, s.Request("add").Body(reader).Exec(context.Background(), &out)
}

// AddDir adds a directory recursively with all of the files under it
func (s *Shell) AddDir(dir string) (string, error) {
stat, err := os.Lstat(dir)
if err != nil {
return "", err
}

sf, err := files.NewSerialFile(path.Base(dir), dir, false, stat)
if err != nil {
return "", err
}
slf := files.NewSliceFile("", dir, []files.File{sf})
reader := files.NewMultiFileReader(slf, true)

resp, err := s.Request("add").
Option("recursive", true).
Body(reader).
Send(context.Background())

if err != nil {
return "", nil
}

defer resp.Close()

if resp.Error != nil {
return "", resp.Error
}

dec := json.NewDecoder(resp.Output)
var final string
for {
var out object
err = dec.Decode(&out)
if err != nil {
if err == io.EOF {
break
}
return "", err
}
final = out.Hash
}

if final == "" {
return "", errors.New("no results received")
}

return final, nil
}

const (
TRaw = iota
TDirectory
Expand Down

0 comments on commit a9ce617

Please sign in to comment.