package mage_helpers
import (
"context"
"fmt"
"io"
"io/ioutil"
"log"
"os"
"os/exec"
"os/signal"
"path"
"path/filepath"
"strings"
"github.com/thoas/go-funk"
"github.com/magefile/mage/sh"
)
func GetDirs(path string) []os.FileInfo {
filesDir, err := ioutil.ReadDir(path)
// filesDir, err := ioutil.ReadDir("/Users/johan/src/Shiplogic/backends/backend/billing")
if err != nil {
log.Fatal(err)
}
dirs := funk.Filter(filesDir, func(info os.FileInfo) bool {
if info.IsDir() && info.Name() == "build" {
return false
}
return info.IsDir()
}).([]os.FileInfo)
return dirs
}
func copyFilesToBuildDir(currentDir string, buildDir string) error {
files, err := AllFiles(currentDir)
if err != nil {
return err
}
for _, file := range files {
fileExtension := filepath.Ext(file)
if fileExtension == ".go" || fileExtension == ".md" || fileExtension == ".html" || fileExtension == ".mjml" || fileExtension == ".txt" {
continue
}
// Copy files to build DIR
err := Copy(file, buildDir+"/"+path.Base(file))
if err != nil {
return err
}
}
return nil
}
func AllFiles(dir string) ([]string, error) {
files := []string{}
err := filepath.Walk(dir,
func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if info.IsDir() {
return nil
}
files = append(files, path)
return nil
})
if err != nil {
return files, err
}
return files, nil
}
func Copy(src, dst string) error {
fileInfo, err := os.Stat(src)
if err != nil {
return err
}
if fileInfo.Mode() == os.ModeSymlink {
src, err = os.Readlink(src)
if err != nil {
return err
}
}
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
}
err = os.Chmod(dst, fileInfo.Mode())
if err != nil {
return err
}
return out.Close()
}
func CurrentBasePath() string {
currentDir, _ := os.Getwd()
base := path.Base(currentDir)
return base
}
func CurrentEnv() string {
// Get env from CI commit branch
env := os.Getenv("CI_COMMIT_BRANCH")
// Get env from current git branch
if env == "" {
commandArgs := []string{
`rev-parse`,
`--abbrev-ref`,
`HEAD`,
}
var err error
env, err = sh.Output("git", commandArgs...)
if err != nil {
return ""
}
}
if env != "dev" && env != "stage" && env != "qa" && env != "sandbox" && env != "prod" && env != "playground" {
env = "dev"
}
return env
}
const (
exitCodeErr = 1
exitCodeInterrupt = 2
)
func killWithContext(ctx context.Context) {
cancelContext, cancel := context.WithCancel(ctx)
signalChan := make(chan os.Signal, 1)
signal.Notify(signalChan, os.Interrupt)
defer func() {
signal.Stop(signalChan)
cancel()
}()
go func() {
select {
case <-signalChan: // first signal, cancel context
cancel()
os.Exit(exitCodeInterrupt)
case <-cancelContext.Done():
}
<-signalChan // second signal, hard exit
os.Exit(exitCodeInterrupt)
}()
}
func BuildCommand(command string, args []string) *exec.Cmd {
fmt.Println(fmt.Sprintf("Running command: %s %s", command, strings.Join(args, " ")))
cmd := exec.Command(command, args...)
return cmd
}