Skip to content

Commit

Permalink
Merge pull request #260 from std0/union-readdir-fix
Browse files Browse the repository at this point in the history
Fix amount of files read in UnionFile.Readdir
  • Loading branch information
0xmichalis committed Sep 2, 2020
2 parents 215b26b + 066c8b0 commit 27c9ee0
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 14 deletions.
20 changes: 16 additions & 4 deletions composite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -477,7 +477,8 @@ func TestUnionFileReaddirAskForTooMany(t *testing.T) {
base := &MemMapFs{}
overlay := &MemMapFs{}

for i := 0; i < 5; i++ {
const testFiles = 5
for i := 0; i < testFiles; i++ {
WriteFile(base, fmt.Sprintf("file%d.txt", i), []byte("afero"), 0777)
}

Expand All @@ -490,13 +491,24 @@ func TestUnionFileReaddirAskForTooMany(t *testing.T) {

defer f.Close()

names, err := f.Readdirnames(6)
// Read part of all files
wantNames := 3
names, err := f.Readdirnames(wantNames)
if err != nil {
t.Fatal(err)
}
if len(names) != wantNames {
t.Fatalf("got %d names %v, want %d", len(names), names, wantNames)
}

if len(names) != 5 {
t.Fatal(names)
// Try to read more files than remaining
wantNames = testFiles - len(names)
names, err = f.Readdirnames(wantNames + 1)
if err != nil {
t.Fatal(err)
}
if len(names) != wantNames {
t.Fatalf("got %d names %v, want %d", len(names), names, wantNames)
}

// End of directory
Expand Down
17 changes: 7 additions & 10 deletions unionFile.go
Original file line number Diff line number Diff line change
Expand Up @@ -186,25 +186,22 @@ func (f *UnionFile) Readdir(c int) (ofi []os.FileInfo, err error) {
}
f.files = append(f.files, merged...)
}
files := f.files[f.off:]

if c <= 0 && len(f.files) == 0 {
return f.files, nil
if c <= 0 {
return files, nil
}

if f.off >= len(f.files) {
if len(files) == 0 {
return nil, io.EOF
}

if c <= 0 {
return f.files[f.off:], nil
}

if c > len(f.files) {
c = len(f.files)
if c > len(files) {
c = len(files)
}

defer func() { f.off += c }()
return f.files[f.off:c], nil
return files[:c], nil
}

func (f *UnionFile) Readdirnames(c int) ([]string, error) {
Expand Down

0 comments on commit 27c9ee0

Please sign in to comment.