gouick/helpers/file.go
2022-07-25 20:43:53 +00:00

170 lines
3.1 KiB
Go

package helpers
import (
"io/fs"
"io/ioutil"
"os"
"path/filepath"
"github.com/juju/errors"
log "github.com/sirupsen/logrus"
)
func IsGouickDirectory(path string) (bool, error) {
binPath, err := os.Executable()
if err != nil {
return false, errors.Trace(err)
}
gouickPath := filepath.Dir(binPath)
if gouickPath != path {
return false, nil
}
return true, nil
}
func IsGouickProject(path string) (bool, error) {
exist, err := fileExists(filepath.Join(path, configFile))
if err != nil {
return false, errors.Trace(err)
}
if !exist {
return false, nil
}
return true, nil
}
func IsGoProject(path string) (bool, error) {
exist, err := fileExists(filepath.Join(path, "go.mod"))
if err != nil {
return false, errors.Trace(err)
}
if exist {
return true, nil
}
exist, err = fileExists(filepath.Join(path, "go.sum"))
if err != nil {
return false, errors.Trace(err)
}
if exist {
return true, nil
}
return false, nil
}
func fileExists(path string) (bool, error) {
fileInfo, err := os.Stat(path)
if err != nil {
if errors.Is(err, fs.ErrPermission) {
return false, errors.NewForbidden(err, "file is not readeable")
} else if errors.Is(err, fs.ErrNotExist) {
return false, nil
} else {
return false, errors.Trace(err)
}
}
if fileInfo.IsDir() {
return false, errors.NotValidf("%s is actually a directory", path)
}
return true, nil
}
// isDirectoryWritable
func isDirectoryWritable(path string) (bool, error) {
dirInfo, err := os.Stat(path)
if err != nil {
if errors.Is(err, fs.ErrPermission) {
return false, errors.NewForbidden(err, "directory is not readeable")
} else if errors.Is(err, fs.ErrNotExist) {
return false, errors.NewNotFound(err, "directory does not exit")
} else {
return false, errors.Trace(err)
}
}
if !dirInfo.IsDir() {
return false, errors.NotSupportedf("given path is not a directory")
}
if dirInfo.Mode().Perm()&(1<<(uint(7))) == 0 {
return false, nil
}
return true, nil
}
// createDirectory
func createDirectory(path string) error {
// no need to check if path exist
// MkdirAll will do it for us
err := os.MkdirAll(path, os.ModePerm)
if err != nil {
return errors.Trace(err)
}
return nil
}
// CheckAndCreateDir will check if path is writable and create directory if needed
func CheckAndCreateDir(path string) error {
dirWritable, err := isDirectoryWritable(path)
if dirWritable {
return nil
} else if err != nil && !errors.Is(err, errors.NotFound) {
log.Warnf("impossible to check if the directory is writable")
return err
} else if err == nil && !dirWritable {
log.Warnf("directory is not writable")
return errors.Forbiddenf("directory is not writable")
}
err = createDirectory(path)
if err != nil {
log.Warnf("impossible to create directory (%s), please try again", err.Error())
return err
}
return nil
}
func RemoveDirectoryContent(path string) error {
dir, err := ioutil.ReadDir(path)
if err != nil {
return errors.Trace(err)
}
for _, d := range dir {
err := os.RemoveAll(
filepath.Join(path, d.Name()),
)
if err != nil {
return errors.Trace(err)
}
}
return nil
}