afero icon indicating copy to clipboard operation
afero copied to clipboard

afero.NewRegexpFs OpenFile error if file not exists

Open sergerdn opened this issue 4 years ago • 0 comments

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

sergerdn avatar Nov 30 '20 13:11 sergerdn