From 77ca7d8c9fa5af499b4f88de61d87d9bcb8e8bea Mon Sep 17 00:00:00 2001 From: Alex Goodman Date: Sat, 20 Jul 2019 18:21:52 -0400 Subject: [PATCH] adding whiteout should be a noop, not an error --- filetree/tree.go | 7 ++++++- filetree/tree_test.go | 35 +++++++++++++++++++++++++++++++---- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/filetree/tree.go b/filetree/tree.go index 27d1f07..fc4cf7f 100644 --- a/filetree/tree.go +++ b/filetree/tree.go @@ -241,6 +241,11 @@ func (tree *FileTree) AddPath(path string, data FileInfo) (*FileNode, []*FileNod if node.Children[name] != nil { node = node.Children[name] } else { + // don't add paths that should be deleted + if strings.HasPrefix(name, doubleWhiteoutPrefix) { + return nil, addedNodes, nil + } + // don't attach the payload. The payload is destined for the // Path's end node, not any intermediary node. node = node.AddChild(name, FileInfo{}) @@ -248,7 +253,7 @@ func (tree *FileTree) AddPath(path string, data FileInfo) (*FileNode, []*FileNod if node == nil { // the child could not be added - return node, addedNodes, fmt.Errorf(fmt.Sprintf("could not add child node '%s'", name)) + return node, addedNodes, fmt.Errorf(fmt.Sprintf("could not add child node: '%s' (path:'%s')", name, path)) } } diff --git a/filetree/tree_test.go b/filetree/tree_test.go index 2007d04..7be1bb2 100644 --- a/filetree/tree_test.go +++ b/filetree/tree_test.go @@ -172,6 +172,30 @@ func TestAddPath(t *testing.T) { } +func TestAddWhiteoutPath(t *testing.T) { + tree := NewFileTree() + node, _, err := tree.AddPath("usr/local/lib/python3.7/site-packages/pip/.wh..wh..opq", FileInfo{}) + if err != nil { + t.Errorf("expected no error but got: %v", err) + } + if node != nil { + t.Errorf("expected node to be nil, but got: %v", node) + } + expected := + `└── usr + └── local + └── lib + └── python3.7 + └── site-packages + └── pip +` + actual := tree.String(false) + + if expected != actual { + t.Errorf("Expected tree string:\n--->%s<---\nGot:\n--->%s<---", expected, actual) + } +} + func TestRemovePath(t *testing.T) { tree := NewFileTree() _, _, err := tree.AddPath("/etc/nginx/nginx.conf", FileInfo{}) @@ -275,9 +299,12 @@ func TestStack(t *testing.T) { t.Errorf("could not setup test: %v", err) } // ignore opaque whiteout files entirely - _, _, err = tree2.AddPath("/.wh..wh..opq", FileInfo{}) - if err == nil { - t.Errorf("expected error on whiteout file add, got none") + node, _, err := tree2.AddPath("/.wh..wh..opq", FileInfo{}) + if err != nil { + t.Errorf("expected no error on whiteout file add, but got %v", err) + } + if node != nil { + t.Errorf("expected no node on whiteout file add, but got %v", node) } err = tree1.Stack(tree2) @@ -296,7 +323,7 @@ func TestStack(t *testing.T) { └── systemd ` - node, err := tree1.GetNode(payloadKey) + node, err = tree1.GetNode(payloadKey) if err != nil { t.Errorf("Expected '%s' to still exist, but it doesn't", payloadKey) }