Skip to content

Commit d7cc653

Browse files
committed
Filter hidden files and folders, as well as files without extensions
from FetchFileList Add tests for hidden file and extension filtering in FetchFileList
1 parent 1333c6d commit d7cc653

File tree

2 files changed

+104
-3
lines changed

2 files changed

+104
-3
lines changed

server/disk_space_primitives.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,10 @@ func (d *DiskSpacePrimitives) fileInfoToFileMeta(path string, info os.FileInfo)
105105
}
106106

107107
// FetchFileList implements SpacePrimitives.FetchFileList
108+
// Returns a list of files in the space, with the following filtering rules:
109+
// - Hidden files and directories (starting with '.') are excluded at any depth
110+
// - Files without extensions are excluded
111+
// - Files matching gitignore patterns are excluded
108112
func (d *DiskSpacePrimitives) FetchFileList() ([]FileMeta, error) {
109113
var allFiles []FileMeta
110114

@@ -114,8 +118,16 @@ func (d *DiskSpacePrimitives) FetchFileList() ([]FileMeta, error) {
114118
return nil
115119
}
116120

117-
// Skip directories
121+
// Skip hidden directories and stop traversal into them
118122
if entry.IsDir() {
123+
if strings.HasPrefix(entry.Name(), ".") {
124+
return filepath.SkipDir
125+
}
126+
return nil
127+
}
128+
129+
// Skip hidden files
130+
if strings.HasPrefix(entry.Name(), ".") {
119131
return nil
120132
}
121133

@@ -126,8 +138,8 @@ func (d *DiskSpacePrimitives) FetchFileList() ([]FileMeta, error) {
126138
return nil
127139
}
128140

129-
// Skip hidden folders in root
130-
if strings.HasPrefix(relativePath, ".") {
141+
// Skip files without extensions
142+
if filepath.Ext(relativePath) == "" {
131143
return nil
132144
}
133145

server/disk_space_primitives_test.go

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,95 @@ func TestGitIgnore(t *testing.T) {
6161

6262
}
6363

64+
func TestHiddenFilesAndDirectories(t *testing.T) {
65+
space, err := NewDiskSpacePrimitives(t.TempDir(), "")
66+
assert.NoError(t, err, "Failed to create DiskSpacePrimitives")
67+
68+
// Create various files and directories
69+
_, err = space.WriteFile("visible.txt", []byte("visible"), nil)
70+
assert.NoError(t, err)
71+
72+
_, err = space.WriteFile(".hidden.txt", []byte("hidden"), nil)
73+
assert.NoError(t, err)
74+
75+
_, err = space.WriteFile("dir/.hidden.txt", []byte("hidden in dir"), nil)
76+
assert.NoError(t, err)
77+
78+
_, err = space.WriteFile("dir/visible.txt", []byte("visible in dir"), nil)
79+
assert.NoError(t, err)
80+
81+
_, err = space.WriteFile(".hidden/visible.txt", []byte("visible in hidden dir"), nil)
82+
assert.NoError(t, err)
83+
84+
// Test deeply nested hidden directory
85+
_, err = space.WriteFile(".hidden/.nested/deep.txt", []byte("deep nested hidden"), nil)
86+
assert.NoError(t, err)
87+
88+
_, err = space.WriteFile("visible/.hidden/nested.txt", []byte("hidden in visible dir"), nil)
89+
assert.NoError(t, err)
90+
91+
fileList, err := space.FetchFileList()
92+
assert.NoError(t, err)
93+
94+
// Should only contain visible files (not hidden files or files in hidden directories)
95+
assert.Len(t, fileList, 2)
96+
97+
fileNames := make([]string, len(fileList))
98+
for i, file := range fileList {
99+
fileNames[i] = file.Name
100+
}
101+
102+
assert.Contains(t, fileNames, "visible.txt")
103+
assert.Contains(t, fileNames, "dir/visible.txt")
104+
assert.NotContains(t, fileNames, ".hidden.txt")
105+
assert.NotContains(t, fileNames, "dir/.hidden.txt")
106+
assert.NotContains(t, fileNames, ".hidden/visible.txt")
107+
assert.NotContains(t, fileNames, ".hidden/.nested/deep.txt")
108+
assert.NotContains(t, fileNames, "visible/.hidden/nested.txt")
109+
}
110+
111+
func TestFileExtensionRequirement(t *testing.T) {
112+
space, err := NewDiskSpacePrimitives(t.TempDir(), "")
113+
assert.NoError(t, err, "Failed to create DiskSpacePrimitives")
114+
115+
// Create files with and without extensions
116+
_, err = space.WriteFile("file.txt", []byte("with extension"), nil)
117+
assert.NoError(t, err)
118+
119+
_, err = space.WriteFile("file.md", []byte("with extension"), nil)
120+
assert.NoError(t, err)
121+
122+
_, err = space.WriteFile("noextension", []byte("without extension"), nil)
123+
assert.NoError(t, err)
124+
125+
_, err = space.WriteFile("README", []byte("without extension"), nil)
126+
assert.NoError(t, err)
127+
128+
_, err = space.WriteFile("dir/file.json", []byte("with extension in dir"), nil)
129+
assert.NoError(t, err)
130+
131+
_, err = space.WriteFile("dir/noext", []byte("without extension in dir"), nil)
132+
assert.NoError(t, err)
133+
134+
fileList, err := space.FetchFileList()
135+
assert.NoError(t, err)
136+
137+
// Should only contain files with extensions
138+
assert.Len(t, fileList, 3)
139+
140+
fileNames := make([]string, len(fileList))
141+
for i, file := range fileList {
142+
fileNames[i] = file.Name
143+
}
144+
145+
assert.Contains(t, fileNames, "file.txt")
146+
assert.Contains(t, fileNames, "file.md")
147+
assert.Contains(t, fileNames, "dir/file.json")
148+
assert.NotContains(t, fileNames, "noextension")
149+
assert.NotContains(t, fileNames, "README")
150+
assert.NotContains(t, fileNames, "dir/noext")
151+
}
152+
64153
// Test directory cleanup - specific to disk implementation
65154
func TestCleanOrphaned(t *testing.T) {
66155
tmpDir := t.TempDir()

0 commit comments

Comments
 (0)