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
+}