afero
afero copied to clipboard
afero.NewRegexpFs OpenFile error if file not exists
Hi, there. I believe that we have a bug with afero.NewRegexpFs
and fs.OpenFile
. fs.Create
works as expected.
Code:
package main
import (
"fmt"
"os"
"path/filepath"
"regexp"
"github.com/pkg/errors"
"github.com/spf13/afero"
)
func testFsOpen(fs afero.Fs, fileName string) (fileHandle afero.File, err error) {
// create file if not exists for write only
fileHandle, err = fs.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, os.FileMode(600))
if err == nil {
// close and remove
defer fileHandle.Close()
defer fs.Remove(fileName)
}
return fileHandle, err
}
func testFsCreate(fs afero.Fs, fileName string) (fileHandle afero.File, err error) {
fileHandle, err = fs.Create(fileName)
if err == nil {
// close and remove
defer fileHandle.Close()
defer fs.Remove(fileName)
}
return fileHandle, err
}
func main() {
var err error
var testDir = "/testDir"
var testFileCreate = filepath.Join(testDir, "fileCreate.yaml")
var testFileOpen = filepath.Join(testDir, "testFileOpen.yaml")
RegexpFs := afero.NewRegexpFs(afero.NewMemMapFs(), regexp.MustCompile(`\.yaml$`))
MemFs := afero.NewMemMapFs()
if err = RegexpFs.MkdirAll(testDir, os.FileMode(700)); err != nil {
fmt.Println(errors.Wrap(err, "RegexpFs.MkdirAll error"))
}
if err = MemFs.MkdirAll(testDir, os.FileMode(700)); err != nil {
fmt.Println(errors.Wrap(err, "MemFs.MkdirAll error"))
}
// create file works as expected for both fs
if _, err = testFsCreate(MemFs, testFileCreate); err != nil {
fmt.Println(errors.Wrap(err, "MemFs create file error"))
} else {
fmt.Printf("MemFs file created: %s\n", testFileCreate)
}
if _, err = testFsCreate(RegexpFs, testFileCreate); err != nil {
fmt.Println(errors.Wrap(err, "RegexpFs create file error"))
} else {
fmt.Printf("RegexpFs file created: %s\n", testFileCreate)
}
// works as expected, no error:
if _, err = testFsOpen(MemFs, testFileOpen); err != nil {
fmt.Println(errors.Wrap(err, "MemFs open file error"))
} else {
fmt.Printf("MemFs file opened: %s\n", testFileOpen)
}
// works NOT as expected, error <=======:
if _, err = testFsOpen(RegexpFs, testFileOpen); err != nil {
fmt.Println(errors.Wrap(err, "Regexp open file error"))
} else {
fmt.Printf("RegexpFs file opened: %s\n", testFileOpen)
}
}
Output:
MemFs file created: /testDir/fileCreate.yaml
RegexpFs file created: /testDir/fileCreate.yaml
MemFs file opened: /testDir/testFileOpen.yaml
Regexp open file error: open /testDir/testFileOpen.yaml: file does not exist