Skip to content

Commit 47dca25

Browse files
committed
Fix mfs touch and chmod
Fixes #660
1 parent f35ddcb commit 47dca25

File tree

2 files changed

+31
-15
lines changed

2 files changed

+31
-15
lines changed

ipld/unixfs/unixfs.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ const (
3636
// Common errors
3737
var (
3838
ErrMalformedFileFormat = errors.New("malformed data in file format")
39+
ErrNotProtoNode = errors.New("expected a ProtoNode as internal node")
3940
ErrUnrecognizedType = errors.New("unrecognized node type")
4041
)
4142

@@ -544,7 +545,7 @@ func ReadUnixFSNodeData(node ipld.Node) (data []byte, err error) {
544545
func ExtractFSNode(node ipld.Node) (*FSNode, error) {
545546
protoNode, ok := node.(*dag.ProtoNode)
546547
if !ok {
547-
return nil, errors.New("expected a ProtoNode as internal node")
548+
return nil, ErrNotProtoNode
548549
}
549550

550551
fsNode, err := FSNodeFromBytes(protoNode.Data())

mfs/file.go

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -185,14 +185,14 @@ func (fi *File) Mode() (os.FileMode, error) {
185185
defer fi.nodeLock.RUnlock()
186186

187187
nd, err := fi.GetNode()
188-
if err == nil {
189-
fsn, err := ft.ExtractFSNode(nd)
190-
if err == nil {
191-
return fsn.Mode() & 0xFFF, nil
192-
}
188+
if err != nil {
189+
return 0, err
193190
}
194-
195-
return 0, err
191+
fsn, err := ft.ExtractFSNode(nd)
192+
if err != nil {
193+
return 0, err
194+
}
195+
return fsn.Mode() & 0xFFF, nil
196196
}
197197

198198
func (fi *File) SetMode(mode os.FileMode) error {
@@ -203,6 +203,11 @@ func (fi *File) SetMode(mode os.FileMode) error {
203203

204204
fsn, err := ft.ExtractFSNode(nd)
205205
if err != nil {
206+
if errors.Is(err, ft.ErrNotProtoNode) {
207+
// Wrap raw node in protonode.
208+
data := nd.RawData()
209+
return fi.setNodeData(ft.FilePBDataWithStat(data, uint64(len(data)), mode, time.Time{}))
210+
}
206211
return err
207212
}
208213

@@ -221,14 +226,14 @@ func (fi *File) ModTime() (time.Time, error) {
221226
defer fi.nodeLock.RUnlock()
222227

223228
nd, err := fi.GetNode()
224-
if err == nil {
225-
fsn, err := ft.ExtractFSNode(nd)
226-
if err == nil {
227-
return fsn.ModTime(), nil
228-
}
229+
if err != nil {
230+
return time.Time{}, err
229231
}
230-
231-
return time.Time{}, err
232+
fsn, err := ft.ExtractFSNode(nd)
233+
if err != nil {
234+
return time.Time{}, err
235+
}
236+
return fsn.ModTime(), nil
232237
}
233238

234239
// SetModTime sets the files' last modification time
@@ -240,6 +245,11 @@ func (fi *File) SetModTime(ts time.Time) error {
240245

241246
fsn, err := ft.ExtractFSNode(nd)
242247
if err != nil {
248+
if errors.Is(err, ft.ErrNotProtoNode) {
249+
// Wrap raw node in protonode.
250+
data := nd.RawData()
251+
return fi.setNodeData(ft.FilePBDataWithStat(data, uint64(len(data)), 0, ts))
252+
}
243253
return err
244254
}
245255

@@ -267,3 +277,8 @@ func (fi *File) setNodeData(data []byte) error {
267277

268278
return parent.updateChildEntry(child{name, fi.node})
269279
}
280+
281+
func (fi *File) replaceRawNodeWithStatNode(data []byte, mode os.FileMode, mtime time.Time) error {
282+
data = ft.FilePBDataWithStat(data, uint64(len(data)), mode, mtime)
283+
return fi.setNodeData(data)
284+
}

0 commit comments

Comments
 (0)