@cryptotaxi247 / kubo / commits / 9bbd9b061

give ipfs get symlink support

License: MIT Signed-off-by: Jeromy <jeromyj@gmail.com>

Jeromy committed Aug 30, 2015 at 22:14 UTC 9bbd9b061d6a53faab8c8e5f52ea80888caaf2d9
3 files changed +28 -10
core/commands/add.go
-4
@@ -143,7 +143,6 @@ remains to be implemented.
143 return nil // done
144 }
145
146 - log.Errorf("FILE: %#v", file)
146 if _, err := fileAdder.addFile(file); err != nil {
147 return err
148 }
@@ -361,9 +360,6 @@ func (params *adder) addFile(file files.File) (*dag.Node, error) {
360 }
361
362 if s, ok := file.(*files.Symlink); ok {
364 - log.Error("SYMLINK: ", s)
365 - log.Error(s.Target)
366 - log.Error(s.FileName())
363 dagnode := &dag.Node{
364 Data: ft.SymlinkData(s.Target),
365 }
thirdparty/tar/extractor.go
+17 -6
@@ -2,6 +2,7 @@ package tar
2
3 import (
4 "archive/tar"
5 + "fmt"
6 "io"
7 "os"
8 gopath "path"
@@ -39,15 +40,21 @@ func (te *Extractor) Extract(reader io.Reader) error {
40 break
41 }
42
42 - if header.Typeflag == tar.TypeDir {
43 + switch header.Typeflag {
44 + case tar.TypeDir:
45 if err := te.extractDir(header, i); err != nil {
46 return err
47 }
46 - continue
47 - }
48 -
49 - if err := te.extractFile(header, tarReader, i, rootExists, rootIsDir); err != nil {
50 - return err
48 + case tar.TypeReg:
49 + if err := te.extractFile(header, tarReader, i, rootExists, rootIsDir); err != nil {
50 + return err
51 + }
52 + case tar.TypeSymlink:
53 + if err := te.extractSymlink(header); err != nil {
54 + return err
55 + }
56 + default:
57 + return fmt.Errorf("unrecognized tar header type: %d", header.Typeflag)
58 }
59 }
60 return nil
@@ -79,6 +86,10 @@ func (te *Extractor) extractDir(h *tar.Header, depth int) error {
86 return nil
87 }
88
89 +func (te *Extractor) extractSymlink(h *tar.Header) error {
90 + return os.Symlink(h.Linkname, te.outputPath(h.Name))
91 +}
92 +
93 func (te *Extractor) extractFile(h *tar.Header, r *tar.Reader, depth int, rootExists bool, rootIsDir bool) error {
94 path := te.outputPath(h.Name)
95
unixfs/archive/tar/writer.go
+11
@@ -79,6 +79,8 @@ func (w *Writer) WriteNode(nd *mdag.Node, fpath string) error {
79 fallthrough
80 case upb.Data_File:
81 return w.writeFile(nd, pb, fpath)
82 + case upb.Data_Symlink:
83 + return writeSymlinkHeader(w.TarW, string(pb.GetData()), fpath)
84 default:
85 return ft.ErrUnrecognizedType
86 }
@@ -108,3 +110,12 @@ func writeFileHeader(w *tar.Writer, fpath string, size uint64) error {
110 // TODO: set mode, dates, etc. when added to unixFS
111 })
112 }
113 +
114 +func writeSymlinkHeader(w *tar.Writer, target, fpath string) error {
115 + return w.WriteHeader(&tar.Header{
116 + Name: fpath,
117 + Linkname: target,
118 + Mode: 0777,
119 + Typeflag: tar.TypeSymlink,
120 + })
121 +}