From 1835e988cf7738112ea88250780e6c6518899359 Mon Sep 17 00:00:00 2001 From: Alexander Neumann Date: Sun, 7 Feb 2016 19:50:17 +0100 Subject: [PATCH] fuse: Replace special node names with their content This is the companion fix for #419 and allows mounting repositories with special directory names directly below the snapshot. Closes #403 --- fuse/dir.go | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/fuse/dir.go b/fuse/dir.go index 19f5d569f..a8bfeba07 100644 --- a/fuse/dir.go +++ b/fuse/dir.go @@ -45,14 +45,40 @@ func newDir(repo *repository.Repository, node *restic.Node, ownerIsRoot bool) (* }, nil } +// replaceSpecialNodes replaces nodes with name "." and "/" by their contents. +// Otherwise, the node is returned. +func replaceSpecialNodes(repo *repository.Repository, node *restic.Node) ([]*restic.Node, error) { + if node.Type != "dir" || node.Subtree == nil { + return []*restic.Node{node}, nil + } + + if node.Name != "." && node.Name != "/" { + return []*restic.Node{node}, nil + } + + tree, err := restic.LoadTree(repo, *node.Subtree) + if err != nil { + return nil, err + } + + return tree.Nodes, nil +} + func newDirFromSnapshot(repo *repository.Repository, snapshot SnapshotWithId, ownerIsRoot bool) (*dir, error) { tree, err := restic.LoadTree(repo, *snapshot.Tree) if err != nil { return nil, err } items := make(map[string]*restic.Node) - for _, node := range tree.Nodes { - items[node.Name] = node + for _, n := range tree.Nodes { + nodes, err := replaceSpecialNodes(repo, n) + if err != nil { + return nil, err + } + + for _, node := range nodes { + items[node.Name] = node + } } return &dir{