src-d / go-billy

The missing interface filesystem abstraction for Go
https://godoc.org/gopkg.in/src-d/go-billy.v4
Apache License 2.0
199 stars 43 forks source link

memfs doesn't handle creating and opening files in directory which is a symlink #72

Open gildor478 opened 5 years ago

gildor478 commented 5 years ago

Whenever I create a symlink to a directory, I cannot create/open files using this symlink. It works perfectly, if I use "osfs".

Here is a test for this bug:

import (
    "testing"

    "github.com/stretchr/testify/assert"
    "github.com/stretchr/testify/require"
    "gopkg.in/src-d/go-billy.v4/memfs"
    "gopkg.in/src-d/go-billy.v4/util"
)

func TestSymlink_Mkdir(t *testing.T) {
    fs := memfs.New()
    //fs := osfs.New("/tmp")
    require.NoError(t, fs.MkdirAll("dir", 0755))
    require.NoError(t, util.WriteFile(fs, "dir/file.txt", nil, 0644))
    require.NoError(t, fs.Symlink("dir", "link"))

    _, err := fs.Stat("dir/file.txt")
    assert.NoError(t, err, "reading directly /dir/file.txt")
    _, err = fs.Stat("link/file.txt")
    assert.NoError(t, err, "reading /dir/file.txt through /link")

    fd, err := fs.Create("link/file2.txt")
    assert.NoError(t, err)
    assert.NoError(t, fd.Close())
    _, err = fs.Stat("dir/file2.txt")
    assert.NoError(t, err, "reading file2.txt created into the /link")
}

Let me know if I have made a mistake.