Skip to content

Commit

Permalink
refactor: use the File methods for Stat, Chmod
Browse files Browse the repository at this point in the history
Use the already-open file descriptors for reading/writing metadata,
rather than the long-form VFS versions.

Add/use FailFS fixtures as needed.

Refactor `repository.CopySources` to be a bit simpler
  • Loading branch information
nisimond authored and retr0h committed Mar 14, 2024
1 parent 462e16b commit 3143ddf
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 21 deletions.
20 changes: 20 additions & 0 deletions internal/mocks/vfs/failfs.go
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,14 @@ func (f *FailFile) Chdir() error {
}

func (f *FailFile) Chmod(mode fs.FileMode) error {
if failFn, ok := f.vfs.failFn["file.Chmod"]; ok {
results := f.vfs.callFailFn(failFn, mode)
var err error
if !results[0].IsNil() {
err, _ = results[0].Interface().(error)
}
return err
}
return f.baseFile.Chmod(mode)
}

Expand Down Expand Up @@ -433,6 +441,18 @@ func (f *FailFile) Seek(offset int64, whence int) (ret int64, err error) {
}

func (f *FailFile) Stat() (fs.FileInfo, error) {
if failFn, ok := f.vfs.failFn["file.Stat"]; ok {
results := f.vfs.callFailFn(failFn)
var fileInfo fs.FileInfo
var err error
if !results[0].IsNil() {
fileInfo, _ = results[0].Interface().(fs.FileInfo)
}
if !results[1].IsNil() {
err, _ = results[1].Interface().(error)
}
return fileInfo, err
}
return f.baseFile.Stat()
}

Expand Down
6 changes: 3 additions & 3 deletions internal/repository/copy.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ func (r *Copy) CopyFile(
}
defer func() { _ = in.Close() }()

si, err := r.appFs.Stat(src)
si, err := in.Stat()
if err != nil {
return err
}
Expand All @@ -77,7 +77,7 @@ func (r *Copy) CopyFile(
}
defer func() { _ = out.Close() }()

err = r.appFs.Chmod(dst, 0o600)
err = out.Chmod(0o600)
if err != nil {
return err
}
Expand All @@ -93,7 +93,7 @@ func (r *Copy) CopyFile(
}

// All done; make the permissions match
err = r.appFs.Chmod(dst, si.Mode())
err = out.Chmod(si.Mode())
if err != nil {
return err
}
Expand Down
6 changes: 3 additions & 3 deletions internal/repository/copy_public_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ func (suite *CopyPublicTestSuite) TestCopyFileErrorStat() {
suite.appFs = failfs.New(
suite.appFs,
map[string]interface{}{
"Stat": func(string) (fs.FileInfo, error) { return nil, errors.New("FailFS!") },
"file.Stat": func() (fs.FileInfo, error) { return nil, errors.New("FailFS!") },
},
)
assertFile := suite.appFs.Join(suite.dstDir, "1.txt")
Expand Down Expand Up @@ -143,7 +143,7 @@ func (suite *CopyPublicTestSuite) TestCopyFileErrorSettingDestfilePerms() {
suite.appFs = failfs.New(
suite.appFs,
map[string]interface{}{
"Chmod": func(string, fs.FileMode) error { return errors.New("FailFS!") },
"file.Chmod": func(fs.FileMode) error { return errors.New("FailFS!") },
},
)
assertFile := suite.appFs.Join(suite.dstDir, "1.txt")
Expand Down Expand Up @@ -212,7 +212,7 @@ func (suite *CopyPublicTestSuite) TestCopyFileErrorFinalizingDestfilePerms() {
suite.appFs = failfs.New(
suite.appFs,
map[string]interface{}{
"Chmod": func(name string, mode fs.FileMode) error {
"file.Chmod": func(mode fs.FileMode) error {
if mode == 0o600 {
return nil
}
Expand Down
27 changes: 12 additions & 15 deletions internal/repository/repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,15 +100,23 @@ func (r *Repository) CopySources(
}

for _, src := range globbedSrc {
// The source is a file
if info, err := r.appFs.Stat(src); err == nil && info.Mode().IsRegular() {
// ... and the dst is declared a directory
// The source is a directory
if info, err := r.appFs.Stat(src); err == nil && info.IsDir() {
// ... and dst dir exists
if info, err := r.appFs.Stat(source.DstDir); err == nil && info.IsDir() {
if err := r.appFs.RemoveAll(source.DstDir); err != nil {
return err
}
}
if err := r.copyManager.CopyDir(src, source.DstDir); err != nil {
return err
}
} else {
if source.DstFile != "" {
if err := r.copyManager.CopyFile(src, source.DstFile); err != nil {
return err
}
} else if source.DstDir != "" {
// ... and create the dst directory
if err := r.appFs.MkdirAll(source.DstDir, 0o755); err != nil {
return fmt.Errorf("unable to create dest dir: %s", err)
}
Expand All @@ -118,17 +126,6 @@ func (r *Repository) CopySources(
return err
}
}
// The source is a directory
} else if info, err := r.appFs.Stat(src); err == nil && info.Mode().IsDir() {
// ... and dst dir exists
if info, err := r.appFs.Stat(source.DstDir); err == nil && info.Mode().IsDir() {
if err := r.appFs.RemoveAll(source.DstDir); err != nil {
return err
}
}
if err := r.copyManager.CopyDir(src, source.DstDir); err != nil {
return err
}
}
}
}
Expand Down

0 comments on commit 3143ddf

Please sign in to comment.