beemer/util.go
2019-07-16 13:23:40 -04:00

98 lines
1.8 KiB
Go

package main
import (
"github.com/cosiner/argv"
"github.com/sirupsen/logrus"
"io"
"os"
"path/filepath"
"strings"
)
func initTempDir() {
tmpdir := filepath.Join(os.TempDir(), "beemer")
err := os.Mkdir(tmpdir, 0700)
if err != nil && !os.IsExist(err) {
logrus.Fatal(err)
}
ctx.TempDir = tmpdir
logrus.WithField("dir", tmpdir).Infof("Initialized temp dir")
}
func moveToTempDir(name string) string {
dir := filepath.Join(ctx.TempDir, filepath.Dir(name))
newName := filepath.Join(dir, filepath.Base(name))
err := os.MkdirAll(dir, 0700)
if err != nil && !os.IsExist(err) {
logrus.Fatal(err)
}
absName, _ := filepath.Abs(name)
err = moveFile(absName, newName)
if err != nil {
logrus.Fatal(err)
}
logrus.WithFields(logrus.Fields{
"newName": newName,
}).Trace("Moved to temp dir")
return newName
}
func moveFile(src string, dst string) error {
err := os.Rename(src, dst)
if err != nil {
err := copyFile(src, dst)
if err != nil {
return err
}
err = os.Remove(src)
if err != nil {
return err
}
}
return nil
}
func copyFile(src string, dst string) error {
in, err := os.Open(src)
if err != nil {
return err
}
defer in.Close()
out, err := os.Create(dst)
if err != nil {
return err
}
defer out.Close()
_, err = io.Copy(out, in)
if err != nil {
return err
}
return out.Close()
}
func parseCommand(command string) func(string, string) (string, []string) {
args, _ := argv.Argv([]rune(command), argv.ParseEnv(os.Environ()), argv.Run)
return func(name string, dir string) (string, []string) {
newTokens := make([]string, len(args[0]))
copy(newTokens, args[0])
for i := range newTokens {
newTokens[i] = strings.Replace(newTokens[i], "%file", name,-1)
newTokens[i] = strings.Replace(newTokens[i], "%dir", dir,-1)
}
return args[0][0], newTokens[1:]
}
}