// 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) { 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) req := NewRequest(s.url, "add") req.Body = fileReader resp, err := req.Send(s.httpcli) if err != nil { return "", err } defer resp.Close() if resp.Error != nil { return "", resp.Error } var out object err = json.NewDecoder(resp.Output).Decode(&out) if err != nil { return "", err } return out.Hash, nil }
func (s *Shell) AddLink(target string) (string, error) { link := files.NewLinkFile("", "", target, nil) slf := files.NewSliceFile("", "", []files.File{link}) reader := files.NewMultiFileReader(slf, true) req := s.newRequest("add") req.Body = reader resp, err := req.Send(s.httpcli) if err != nil { return "", err } defer resp.Close() if resp.Error != nil { return "", resp.Error } var out object err = json.NewDecoder(resp.Output).Decode(&out) if err != nil { return "", err } return out.Hash, nil }
func (s *Shell) ObjectPut(obj *IpfsObject) (string, error) { data := new(bytes.Buffer) err := json.NewEncoder(data).Encode(obj) if err != nil { return "", err } rc := ioutil.NopCloser(data) fr := files.NewReaderFile("", "", rc, nil) slf := files.NewSliceFile("", "", []files.File{fr}) fileReader := files.NewMultiFileReader(slf, true) req := s.newRequest("object/put") req.Body = fileReader resp, err := req.Send(s.httpcli) if err != nil { return "", err } defer resp.Close() if resp.Error != nil { return "", resp.Error } var out object err = json.NewDecoder(resp.Output).Decode(&out) if err != nil { return "", err } return out.Hash, nil }
func (s *Shell) BlockPut(block []byte) (string, error) { data := bytes.NewReader(block) rc := ioutil.NopCloser(data) fr := files.NewReaderFile("", "", rc, nil) slf := files.NewSliceFile("", "", []files.File{fr}) fileReader := files.NewMultiFileReader(slf, true) req := s.newRequest("block/put") req.Body = fileReader resp, err := req.Send(s.httpcli) if err != nil { return "", err } defer resp.Close() if resp.Error != nil { return "", resp.Error } var out struct { Key string } err = json.NewDecoder(resp.Output).Decode(&out) if err != nil { return "", err } return out.Key, nil }
// 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("", dir, stat) if err != nil { return "", err } slf := files.NewSliceFile("", dir, []files.File{sf}) reader := files.NewMultiFileReader(slf, true) req := NewRequest(s.url, "add") req.Opts["r"] = "true" req.Body = reader resp, err := req.Send(s.httpcli) if err != nil { return "", err } 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 }
func (s *Shell) PatchData(root string, set bool, data interface{}) (string, error) { var read io.Reader switch d := data.(type) { case io.Reader: read = d case []byte: read = bytes.NewReader(d) case string: read = strings.NewReader(d) default: return "", fmt.Errorf("unrecognized type: %#v", data) } cmd := "append-data" if set { cmd = "set-data" } fr := files.NewReaderFile("", "", ioutil.NopCloser(read), nil) slf := files.NewSliceFile("", "", []files.File{fr}) fileReader := files.NewMultiFileReader(slf, true) req := s.newRequest("object/patch/"+cmd, root) req.Body = fileReader resp, err := req.Send(s.httpcli) if err != nil { return "", err } defer resp.Close() if resp.Error != nil { return "", resp.Error } dec := json.NewDecoder(resp.Output) var out object err = dec.Decode(&out) if err != nil { return "", err } return out.Hash, nil }