diff --git a/go.mod b/go.mod index abe4fe1..7966d4b 100644 --- a/go.mod +++ b/go.mod @@ -2,6 +2,7 @@ module github.com/spf13/afero require ( github.com/pkg/sftp v1.10.1 + github.com/stretchr/testify v1.4.0 golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586 golang.org/x/text v0.3.3 ) diff --git a/memmap.go b/memmap.go index bbcc238..0fa9592 100644 --- a/memmap.go +++ b/memmap.go @@ -317,6 +317,11 @@ func (m *MemMapFs) Rename(oldname, newname string) error { return nil } +func (m *MemMapFs) LstatIfPossible(name string) (os.FileInfo, bool, error) { + fileInfo, err := m.Stat(name) + return fileInfo, false, err +} + func (m *MemMapFs) Stat(name string) (os.FileInfo, error) { f, err := m.Open(name) if err != nil { diff --git a/memmap_test.go b/memmap_test.go index 6ce742c..25e7f09 100644 --- a/memmap_test.go +++ b/memmap_test.go @@ -8,6 +8,9 @@ import ( "runtime" "testing" "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestNormalizePath(t *testing.T) { @@ -650,3 +653,23 @@ func TestMemFsOpenFileModeIllegal(t *testing.T) { t.Fatalf("should not be able to use OpenFile to set illegal mode: %s", info.Mode().String()) } } + +// LstatIfPossible should always return false, since MemMapFs does not +// support symlinks. +func TestMemFsLstatIfPossible(t *testing.T) { + t.Parallel() + + fs := NewMemMapFs() + + // We assert that fs implements Lstater + fsAsserted, ok := fs.(Lstater) + require.True(t, ok, "The filesytem does not implement Lstater") + + file, err := fs.OpenFile("/a.txt", os.O_CREATE, 0o644) + require.NoError(t, err) + defer file.Close() + + _, lstatCalled, err := fsAsserted.LstatIfPossible("/a.txt") + assert.NoError(t, err) + assert.False(t, lstatCalled) +}