mirror of
https://github.com/ipfs/kubo.git
synced 2025-06-24 14:08:13 +08:00
give ipfs get symlink support
License: MIT Signed-off-by: Jeromy <jeromyj@gmail.com>
This commit is contained in:
@ -143,7 +143,6 @@ remains to be implemented.
|
||||
return nil // done
|
||||
}
|
||||
|
||||
log.Errorf("FILE: %#v", file)
|
||||
if _, err := fileAdder.addFile(file); err != nil {
|
||||
return err
|
||||
}
|
||||
@ -361,9 +360,6 @@ func (params *adder) addFile(file files.File) (*dag.Node, error) {
|
||||
}
|
||||
|
||||
if s, ok := file.(*files.Symlink); ok {
|
||||
log.Error("SYMLINK: ", s)
|
||||
log.Error(s.Target)
|
||||
log.Error(s.FileName())
|
||||
dagnode := &dag.Node{
|
||||
Data: ft.SymlinkData(s.Target),
|
||||
}
|
||||
|
19
thirdparty/tar/extractor.go
vendored
19
thirdparty/tar/extractor.go
vendored
@ -2,6 +2,7 @@ package tar
|
||||
|
||||
import (
|
||||
"archive/tar"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
gopath "path"
|
||||
@ -39,16 +40,22 @@ func (te *Extractor) Extract(reader io.Reader) error {
|
||||
break
|
||||
}
|
||||
|
||||
if header.Typeflag == tar.TypeDir {
|
||||
switch header.Typeflag {
|
||||
case tar.TypeDir:
|
||||
if err := te.extractDir(header, i); err != nil {
|
||||
return err
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
case tar.TypeReg:
|
||||
if err := te.extractFile(header, tarReader, i, rootExists, rootIsDir); err != nil {
|
||||
return err
|
||||
}
|
||||
case tar.TypeSymlink:
|
||||
if err := te.extractSymlink(header); err != nil {
|
||||
return err
|
||||
}
|
||||
default:
|
||||
return fmt.Errorf("unrecognized tar header type: %d", header.Typeflag)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@ -79,6 +86,10 @@ func (te *Extractor) extractDir(h *tar.Header, depth int) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (te *Extractor) extractSymlink(h *tar.Header) error {
|
||||
return os.Symlink(h.Linkname, te.outputPath(h.Name))
|
||||
}
|
||||
|
||||
func (te *Extractor) extractFile(h *tar.Header, r *tar.Reader, depth int, rootExists bool, rootIsDir bool) error {
|
||||
path := te.outputPath(h.Name)
|
||||
|
||||
|
@ -79,6 +79,8 @@ func (w *Writer) WriteNode(nd *mdag.Node, fpath string) error {
|
||||
fallthrough
|
||||
case upb.Data_File:
|
||||
return w.writeFile(nd, pb, fpath)
|
||||
case upb.Data_Symlink:
|
||||
return writeSymlinkHeader(w.TarW, string(pb.GetData()), fpath)
|
||||
default:
|
||||
return ft.ErrUnrecognizedType
|
||||
}
|
||||
@ -108,3 +110,12 @@ func writeFileHeader(w *tar.Writer, fpath string, size uint64) error {
|
||||
// TODO: set mode, dates, etc. when added to unixFS
|
||||
})
|
||||
}
|
||||
|
||||
func writeSymlinkHeader(w *tar.Writer, target, fpath string) error {
|
||||
return w.WriteHeader(&tar.Header{
|
||||
Name: fpath,
|
||||
Linkname: target,
|
||||
Mode: 0777,
|
||||
Typeflag: tar.TypeSymlink,
|
||||
})
|
||||
}
|
||||
|
Reference in New Issue
Block a user