Skip to content

Commit 588a75e

Browse files
moorereasonbep
authored andcommitted
Fix UnionFile.Readdir return when c <= 0
Update Readdir to match behavior of stdlib os package. Fixes #197
1 parent f4711e4 commit 588a75e

File tree

2 files changed

+43
-5
lines changed

2 files changed

+43
-5
lines changed

composite_test.go

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ func TestCacheOnReadFsNotInLayer(t *testing.T) {
404404
}
405405

406406
// #194
407-
func TestUniontFileReaddirEmpty(t *testing.T) {
407+
func TestUnionFileReaddirEmpty(t *testing.T) {
408408
osFs := NewOsFs()
409409

410410
base := NewMemMapFs()
@@ -439,7 +439,41 @@ func TestUniontFileReaddirEmpty(t *testing.T) {
439439
}
440440
}
441441

442-
func TestUniontFileReaddirAskForTooMany(t *testing.T) {
442+
// #197
443+
func TestUnionFileReaddirDuplicateEmpty(t *testing.T) {
444+
base := NewMemMapFs()
445+
dir, err := TempDir(base, "", "empty-dir")
446+
if err != nil {
447+
t.Fatal(err)
448+
}
449+
450+
// Overlay shares same empty directory as base
451+
overlay := NewMemMapFs()
452+
err = overlay.Mkdir(dir, 0700)
453+
if err != nil {
454+
t.Fatal(err)
455+
}
456+
457+
ufs := &CopyOnWriteFs{base: base, layer: overlay}
458+
459+
f, err := ufs.Open(dir)
460+
if err != nil {
461+
t.Fatal(err)
462+
}
463+
defer f.Close()
464+
465+
names, err := f.Readdirnames(0)
466+
467+
if err == io.EOF {
468+
t.Errorf("unexpected io.EOF error")
469+
}
470+
471+
if len(names) != 0 {
472+
t.Fatal("should be empty")
473+
}
474+
}
475+
476+
func TestUnionFileReaddirAskForTooMany(t *testing.T) {
443477
base := &MemMapFs{}
444478
overlay := &MemMapFs{}
445479

unionFile.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,8 @@ var defaultUnionMergeDirsFn = func(lofi, bofi []os.FileInfo) ([]os.FileInfo, err
155155
}
156156

157157
// Readdir will weave the two directories together and
158-
// return a single view of the overlayed directories
159-
// At the end of the directory view, the error is io.EOF.
158+
// return a single view of the overlayed directories.
159+
// At the end of the directory view, the error is io.EOF if c > 0.
160160
func (f *UnionFile) Readdir(c int) (ofi []os.FileInfo, err error) {
161161
var merge DirsMerger = f.Merger
162162
if merge == nil {
@@ -187,11 +187,15 @@ func (f *UnionFile) Readdir(c int) (ofi []os.FileInfo, err error) {
187187
f.files = append(f.files, merged...)
188188
}
189189

190+
if c <= 0 && len(f.files) == 0 {
191+
return f.files, nil
192+
}
193+
190194
if f.off >= len(f.files) {
191195
return nil, io.EOF
192196
}
193197

194-
if c == -1 {
198+
if c <= 0 {
195199
return f.files[f.off:], nil
196200
}
197201

0 commit comments

Comments
 (0)