mirror of
https://github.com/ipfs/kubo.git
synced 2025-06-26 07:28:20 +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
|
return nil // done
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Errorf("FILE: %#v", file)
|
|
||||||
if _, err := fileAdder.addFile(file); err != nil {
|
if _, err := fileAdder.addFile(file); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -361,9 +360,6 @@ func (params *adder) addFile(file files.File) (*dag.Node, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if s, ok := file.(*files.Symlink); ok {
|
if s, ok := file.(*files.Symlink); ok {
|
||||||
log.Error("SYMLINK: ", s)
|
|
||||||
log.Error(s.Target)
|
|
||||||
log.Error(s.FileName())
|
|
||||||
dagnode := &dag.Node{
|
dagnode := &dag.Node{
|
||||||
Data: ft.SymlinkData(s.Target),
|
Data: ft.SymlinkData(s.Target),
|
||||||
}
|
}
|
||||||
|
19
thirdparty/tar/extractor.go
vendored
19
thirdparty/tar/extractor.go
vendored
@ -2,6 +2,7 @@ package tar
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"archive/tar"
|
"archive/tar"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
gopath "path"
|
gopath "path"
|
||||||
@ -39,16 +40,22 @@ func (te *Extractor) Extract(reader io.Reader) error {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
if header.Typeflag == tar.TypeDir {
|
switch header.Typeflag {
|
||||||
|
case tar.TypeDir:
|
||||||
if err := te.extractDir(header, i); err != nil {
|
if err := te.extractDir(header, i); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
continue
|
case tar.TypeReg:
|
||||||
}
|
|
||||||
|
|
||||||
if err := te.extractFile(header, tarReader, i, rootExists, rootIsDir); err != nil {
|
if err := te.extractFile(header, tarReader, i, rootExists, rootIsDir); err != nil {
|
||||||
return err
|
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
|
return nil
|
||||||
}
|
}
|
||||||
@ -79,6 +86,10 @@ func (te *Extractor) extractDir(h *tar.Header, depth int) error {
|
|||||||
return nil
|
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 {
|
func (te *Extractor) extractFile(h *tar.Header, r *tar.Reader, depth int, rootExists bool, rootIsDir bool) error {
|
||||||
path := te.outputPath(h.Name)
|
path := te.outputPath(h.Name)
|
||||||
|
|
||||||
|
@ -79,6 +79,8 @@ func (w *Writer) WriteNode(nd *mdag.Node, fpath string) error {
|
|||||||
fallthrough
|
fallthrough
|
||||||
case upb.Data_File:
|
case upb.Data_File:
|
||||||
return w.writeFile(nd, pb, fpath)
|
return w.writeFile(nd, pb, fpath)
|
||||||
|
case upb.Data_Symlink:
|
||||||
|
return writeSymlinkHeader(w.TarW, string(pb.GetData()), fpath)
|
||||||
default:
|
default:
|
||||||
return ft.ErrUnrecognizedType
|
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
|
// 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