diff --git a/file/unixfile.go b/file/unixfile.go index 82ee20a4d..177a1fa71 100644 --- a/file/unixfile.go +++ b/file/unixfile.go @@ -3,6 +3,7 @@ package unixfile import ( "context" "errors" + "github.com/ipfs/go-cid" ft "github.com/ipfs/go-unixfs" uio "github.com/ipfs/go-unixfs/io" @@ -122,14 +123,36 @@ func (d *ufsDirectory) Size() (int64, error) { return d.size, nil } +func (d *ufsDirectory) Cid() cid.Cid { + nd, err := d.dir.GetNode() + if err != nil { + return cid.Undef + } + return nd.Cid() +} + type ufsFile struct { uio.DagReader + nd ipld.Node } func (f *ufsFile) Size() (int64, error) { return int64(f.DagReader.Size()), nil } +func (f *ufsFile) Cid() cid.Cid { + return f.nd.Cid() +} + +type ufsSymLink struct { + files.File + nd ipld.Node +} + +func (s *ufsSymLink) Cid() cid.Cid { + return s.nd.Cid() +} + func newUnixfsDir(ctx context.Context, dserv ipld.DAGService, nd *dag.ProtoNode) (files.Directory, error) { dir, err := uio.NewDirectoryFromNode(dserv, nd) if err != nil { @@ -161,7 +184,7 @@ func NewUnixfsFile(ctx context.Context, dserv ipld.DAGService, nd ipld.Node) (fi return newUnixfsDir(ctx, dserv, dn) } if fsn.Type() == ft.TSymlink { - return files.NewLinkFile(string(fsn.Data()), nil), nil + return &ufsSymLink{File: files.NewLinkFile(string(fsn.Data()), nil), nd: nd}, nil } case *dag.RawNode: @@ -176,6 +199,7 @@ func NewUnixfsFile(ctx context.Context, dserv ipld.DAGService, nd ipld.Node) (fi return &ufsFile{ DagReader: dr, + nd: nd, }, nil }