Refactor changes and test functions

Remove change type in favor of explicit change function.
Using change function makes it more difficult to unnecessarily
add to the change interface.

Update test apply functions to use an interface rather
than a function type.

Signed-off-by: Derek McGowan <derek@mcgstyle.net> (github: dmcgowan)
This commit is contained in:
Derek McGowan 2017-02-02 17:30:11 -08:00
parent 65e8c07847
commit d96e6e3952
5 changed files with 172 additions and 193 deletions

View file

@ -10,12 +10,20 @@ import (
)
// Applier applies single file changes
type Applier func(root string) error
type Applier interface {
Apply(root string) error
}
// NewTestFile returns a file applier which creates a file as the
type applyFn func(root string) error
func (a applyFn) Apply(root string) error {
return a(root)
}
// CreateFile returns a file applier which creates a file as the
// provided name with the given content and permission.
func NewTestFile(name string, content []byte, perm os.FileMode) Applier {
return func(root string) error {
func CreateFile(name string, content []byte, perm os.FileMode) Applier {
return applyFn(func(root string) error {
fullPath := filepath.Join(root, name)
if err := ioutil.WriteFile(fullPath, content, perm); err != nil {
return err
@ -26,67 +34,67 @@ func NewTestFile(name string, content []byte, perm os.FileMode) Applier {
}
return nil
}
})
}
// RemoveFile returns a file applier which removes the provided file name
func RemoveFile(name string) Applier {
return func(root string) error {
return applyFn(func(root string) error {
return os.RemoveAll(filepath.Join(root, name))
}
})
}
// CreateDirectory returns a file applier to create the directory with
// CreateDir returns a file applier to create the directory with
// the provided name and permission
func CreateDirectory(name string, perm os.FileMode) Applier {
return func(root string) error {
func CreateDir(name string, perm os.FileMode) Applier {
return applyFn(func(root string) error {
fullPath := filepath.Join(root, name)
if err := os.MkdirAll(fullPath, perm); err != nil {
return err
}
return nil
}
})
}
// Rename returns a file applier which renames a file
func Rename(old, new string) Applier {
return func(root string) error {
return applyFn(func(root string) error {
return os.Rename(filepath.Join(root, old), filepath.Join(root, new))
}
})
}
// Chown returns a file applier which changes the ownership of a file
func Chown(name string, uid, gid int) Applier {
return func(root string) error {
return applyFn(func(root string) error {
return os.Chown(filepath.Join(root, name), uid, gid)
}
})
}
// Chtime changes access and mod time of file
func Chtime(name string, t time.Time) Applier {
return func(root string) error {
return applyFn(func(root string) error {
return os.Chtimes(filepath.Join(root, name), t, t)
}
})
}
// Symlink returns a file applier which creates a symbolic link
func Symlink(oldname, newname string) Applier {
return func(root string) error {
return applyFn(func(root string) error {
return os.Symlink(oldname, filepath.Join(root, newname))
}
})
}
// Link returns a file applier which creates a hard link
func Link(oldname, newname string) Applier {
return func(root string) error {
return applyFn(func(root string) error {
return os.Link(filepath.Join(root, oldname), filepath.Join(root, newname))
}
})
}
func SetXAttr(name, key, value string) Applier {
return func(root string) error {
return applyFn(func(root string) error {
return sysx.LSetxattr(name, key, []byte(value), 0)
}
})
}
// TODO: Make platform specific, windows applier is always no-op
@ -96,14 +104,14 @@ func SetXAttr(name, key, value string) Applier {
// }
//}
// MultiApply returns a new applier from the given appliers
func MultiApply(appliers ...Applier) Applier {
return func(root string) error {
// Apply returns a new applier from the given appliers
func Apply(appliers ...Applier) Applier {
return applyFn(func(root string) error {
for _, a := range appliers {
if err := a(root); err != nil {
if err := a.Apply(root); err != nil {
return err
}
}
return nil
}
})
}