From 01313dcd2b4197b330adf0564e6a515ca3af81e5 Mon Sep 17 00:00:00 2001 From: Felicitas Pojtinger Date: Mon, 24 Jan 2022 01:02:14 +0100 Subject: [PATCH] feat: Add rest of tests for symlink behaviour of `File.Name` --- pkg/fs/file.go | 8 ++++ pkg/fs/file_test.go | 100 +++++++++++++++++++++++++++++++++++++++++++ pkg/fs/filesystem.go | 4 ++ 3 files changed, 112 insertions(+) diff --git a/pkg/fs/file.go b/pkg/fs/file.go index 699c3fd..09eb9ed 100644 --- a/pkg/fs/file.go +++ b/pkg/fs/file.go @@ -371,6 +371,14 @@ func (f *File) Name() string { f.ioLock.Lock() defer f.ioLock.Unlock() + if f.link != "" { + if pathext.IsRoot(f.link, false) { + return "" + } + + return f.link + } + if pathext.IsRoot(f.path, false) { return "" } diff --git a/pkg/fs/file_test.go b/pkg/fs/file_test.go index c33e4d0..c01e290 100644 --- a/pkg/fs/file_test.go +++ b/pkg/fs/file_test.go @@ -130,6 +130,106 @@ var fileNameTests = []struct { true, true, }, + { + "Can get correct file name for symlink to /test.txt", + "/existingsymlink", + func(f symFs) error { + if _, err := f.Create("/test.txt"); err != nil { + return err + } + + if err := f.SymlinkIfPossible("/test.txt", "/existingsymlink"); err != nil { + return nil + } + + return nil + }, + func(got string) error { + want := "/existingsymlink" + + if got != want { + return fmt.Errorf("invalid name, got %v, want %v", got, want) + } + + return nil + }, + true, + true, + }, + { + "Can get correct file name for symlink to /mydir", + "/existingsymlink", + func(f symFs) error { + if err := f.Mkdir("/mydir", os.ModePerm); err != nil { + return err + } + + if err := f.SymlinkIfPossible("/mydir", "/existingsymlink"); err != nil { + return nil + } + + return nil + }, + func(got string) error { + want := "/existingsymlink" + + if got != want { + return fmt.Errorf("invalid name, got %v, want %v", got, want) + } + + return nil + }, + true, + true, + }, + { + "Can get correct file name for symlink to /mydir/nesteddir", + "/existingsymlink", + func(f symFs) error { + if err := f.MkdirAll("/mydir/nesteddir", os.ModePerm); err != nil { + return err + } + + if err := f.SymlinkIfPossible("/mydir/nesteddir", "/existingsymlink"); err != nil { + return nil + } + + return nil + }, + func(got string) error { + want := "/existingsymlink" + + if got != want { + return fmt.Errorf("invalid name, got %v, want %v", got, want) + } + + return nil + }, + true, + true, + }, + { + "Can get correct file name for symlink to root", + "/existingsymlink", + func(f symFs) error { + if err := f.SymlinkIfPossible("/", "/existingsymlink"); err != nil { + return nil + } + + return nil + }, + func(got string) error { + want := "/existingsymlink" + + if got != want { + return fmt.Errorf("invalid name, got %v, want %v", got, want) + } + + return nil + }, + true, + true, + }, } func TestFile_Name(t *testing.T) { diff --git a/pkg/fs/filesystem.go b/pkg/fs/filesystem.go index 5d3c4bd..78ee48a 100644 --- a/pkg/fs/filesystem.go +++ b/pkg/fs/filesystem.go @@ -521,6 +521,8 @@ func (f *STFS) OpenFile(name string, flag int, perm os.FileMode) (afero.File, er return nil, err } } else { + linkname := hdr.Name + hdr, err = inventory.Stat( f.metadata, @@ -550,6 +552,8 @@ func (f *STFS) OpenFile(name string, flag int, perm os.FileMode) (afero.File, er return nil, err } } + + hdr.Linkname = linkname } } else { return nil, err