pkg/util/file.go (107 lines of code) (raw):
package util
import (
"bytes"
"fmt"
"io/fs"
"os"
"path"
ctrl "sigs.k8s.io/controller-runtime"
)
const (
readWriteMode = 0o666 // -rw-rw-rw- or drw-rw-rw-
dirPermissionBits = 0o755 // -rwxr-xr-x or drwxr-xr-x
logDestKey = "dest"
)
var log = ctrl.Log.WithName("util")
func CreateDirectory(dirPath string) error {
log.Info("Creating directory", "path", dirPath)
if _, err := os.Stat(dirPath); os.IsNotExist(err) {
if err = os.MkdirAll(dirPath, dirPermissionBits); err != nil {
return fmt.Errorf("failed to make directory: %w", err)
}
}
log.Info("Directory has been created", "path", dirPath)
return nil
}
func CopyFiles(src, dest string) error {
log.Info("Start copying files", "src", src, logDestKey, dest)
files, err := os.ReadDir(src)
if err != nil {
return fmt.Errorf("failed to read a content of directory %q: %w", src, err)
}
for _, f := range files {
if f.IsDir() {
continue
}
fp := path.Join(src, f.Name())
var input []byte
input, err = os.ReadFile(fp)
if err != nil {
return fmt.Errorf("failed to read a file %q: %w", fp, err)
}
destFp := path.Join(dest, f.Name())
err = os.WriteFile(destFp, input, dirPermissionBits)
if err != nil {
return fmt.Errorf("failed to write to file %q: %w", destFp, err)
}
}
log.Info("Files have been copied", logDestKey, dest)
return nil
}
func CopyFile(src, dest string) error {
log.Info("Start copying file", "src", src, logDestKey, dest)
input, err := os.ReadFile(src)
if err != nil {
return fmt.Errorf("failed to read a file %q: %w", src, err)
}
err = os.WriteFile(dest, input, dirPermissionBits)
if err != nil {
return fmt.Errorf("failed to write to file %q: %w", dest, err)
}
log.Info("File has been copied", logDestKey, dest)
return nil
}
func DoesDirectoryExist(dirPath string) bool {
if _, err := os.Stat(dirPath); err != nil {
if os.IsNotExist(err) {
return false
}
log.Error(err, "failed to check directory")
return false
}
return true
}
func RemoveDirectory(dirPath string) error {
if err := os.RemoveAll(dirPath); err != nil {
return fmt.Errorf("failed to remove directory %q: %w", dirPath, err)
}
log.Info("directory has been cleaned", "directory", dirPath)
return nil
}
func IsDirectoryEmpty(dirPath string) bool {
files, err := os.ReadDir(dirPath)
if err != nil {
log.Error(err, "failed to check directory")
return false
}
return len(files) == 0
}
func ReplaceStringInFile(file, oldLine, newLine string) error {
input, err := os.ReadFile(file)
if err != nil {
return fmt.Errorf("failed to read a file %q: %w", file, err)
}
output := bytes.ReplaceAll(input, []byte(oldLine), []byte(newLine))
err = os.WriteFile(file, output, readWriteMode)
if err != nil {
return fmt.Errorf("failed to write to file %q: %w", file, err)
}
return nil
}
func GetListFilesInDirectory(src string) ([]fs.DirEntry, error) {
files, err := os.ReadDir(src)
if err != nil {
return nil, fmt.Errorf("failed to read a content of directory %q: %w", src, err)
}
return files, nil
}