diff --git a/pkg/fs/ignore.go b/pkg/fs/ignore.go index 2683a1266..fa721728f 100644 --- a/pkg/fs/ignore.go +++ b/pkg/fs/ignore.go @@ -156,7 +156,7 @@ func (l *IgnoreList) Ignore(fileName string) bool { } } - if l.ignoreHidden && strings.HasPrefix(filepath.Base(fileName), ".") { + if l.ignoreHidden && FileNameHidden(fileName) { l.hiddenFiles = append(l.hiddenFiles, fileName) return true } diff --git a/pkg/fs/name.go b/pkg/fs/name.go index 8c7274a9f..c6acb96ab 100644 --- a/pkg/fs/name.go +++ b/pkg/fs/name.go @@ -53,3 +53,21 @@ func RelName(fileName, dir string) string { return fileName } + +// FileNameHidden tests is a file name belongs to a hidden file. +func FileNameHidden(name string) bool { + if name == "" { + return false + } + + name = filepath.Base(name) + + prefix := name[0:1] + + switch prefix { + case ".", "@": + return true + default: + return false + } +} diff --git a/pkg/fs/name_test.go b/pkg/fs/name_test.go index 31a6b1c0f..b33147244 100644 --- a/pkg/fs/name_test.go +++ b/pkg/fs/name_test.go @@ -67,3 +67,28 @@ func TestFileName(t *testing.T) { assert.Equal(t, "testdata/FOO.XMP.jpeg", result) }) } + +func TestFileNameHidden(t *testing.T) { + t.Run("AtPrefix", func(t *testing.T) { + assert.True(t, FileNameHidden("/some/path/@eaDir")) + }) + t.Run("DotPrefix", func(t *testing.T) { + assert.True(t, FileNameHidden("/some/.folder")) + }) + t.Run("HasAts", func(t *testing.T) { + assert.False(t, FileNameHidden("/some/path/ea@Dir")) + assert.False(t, FileNameHidden("/some/@path/ea@Dir")) + assert.False(t, FileNameHidden("@/eaDir")) + }) + t.Run("HasDots", func(t *testing.T) { + assert.False(t, FileNameHidden("/some/image.jpg.")) + assert.False(t, FileNameHidden("./.some/foo")) + }) + t.Run("False", func(t *testing.T) { + assert.False(t, FileNameHidden("/some/path/folder")) + }) + t.Run("Empty", func(t *testing.T) { + assert.False(t, FileNameHidden("")) + }) + +}