Skip to content
This repository has been archived by the owner on Jul 12, 2022. It is now read-only.

Commit

Permalink
Fix run formula on Windows
Browse files Browse the repository at this point in the history
Signed-off-by: Kadu Artur Prussek <[email protected]>
  • Loading branch information
kaduartur committed Mar 9, 2021
1 parent 1206041 commit 6b23eca
Show file tree
Hide file tree
Showing 8 changed files with 100 additions and 56 deletions.
2 changes: 1 addition & 1 deletion pkg/commands/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ func Build() *cobra.Command {
formulaLocalRun := local.NewRunner(inputResolver, formulaLocalPreRun, fileManager, envFinder, userHomeDir)

formulaDockerPreRun := docker.NewPreRun(ritchieHomeDir, formBuildDocker, dirManager, fileManager)
formulaDockerRun := docker.NewRunner(inputResolver, formulaDockerPreRun, fileManager, envFinder, userHomeDir)
formulaDockerRun := docker.NewRunner(userHomeDir, inputResolver, formulaDockerPreRun, envFinder)

runners := formula.Runners{
formula.LocalRun: formulaLocalRun,
Expand Down
32 changes: 14 additions & 18 deletions pkg/formula/runner/docker/runner.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,11 @@ package docker

import (
"fmt"
"io/ioutil"
"os"
"os/exec"
"strconv"
"strings"

"github.com/ZupIT/ritchie-cli/pkg/env"

Expand All @@ -29,7 +31,6 @@ import (

"github.com/ZupIT/ritchie-cli/pkg/api"
"github.com/ZupIT/ritchie-cli/pkg/formula"
"github.com/ZupIT/ritchie-cli/pkg/stream"
)

const (
Expand All @@ -40,24 +41,21 @@ const (
var _ formula.Runner = RunManager{}

type RunManager struct {
homeDir string
env env.Finder
formula.InputResolver
formula.PreRunner
file stream.FileWriteExistAppendRemover
env env.Finder
homeDir string
}

func NewRunner(
homeDir string,
input formula.InputResolver,
preRun formula.PreRunner,
file stream.FileWriteExistAppendRemover,
env env.Finder,
homeDir string,
) formula.Runner {
return RunManager{
InputResolver: input,
PreRunner: preRun,
file: file,
env: env,
homeDir: homeDir,
}
Expand All @@ -70,7 +68,7 @@ func (ru RunManager) Run(def formula.Definition, inputType api.TermInputType, ve
}

defer func() {
if err := ru.file.Remove(envFile); err != nil {
if err := os.Remove(envFile); err != nil {
return
}
}()
Expand Down Expand Up @@ -157,16 +155,14 @@ func (ru RunManager) setEnvs(cmd *exec.Cmd, pwd string, verbose bool) error {
verboseEnv := fmt.Sprintf(formula.EnvPattern, formula.VerboseEnv, strconv.FormatBool(verbose))
cmd.Env = append(cmd.Env, pwdEnv, ctxEnv, verboseEnv, dockerEnv, env)

for _, e := range cmd.Env { // Create a file named .envHolder and add the environment variable inName=inValue
if !ru.file.Exists(envFile) {
if err := ru.file.Write(envFile, []byte(e+"\n")); err != nil {
return err
}
continue
}
if err := ru.file.Append(envFile, []byte(e+"\n")); err != nil {
return err
}
envs := strings.Builder{}
for _, e := range cmd.Env {
envs.WriteString(e + "\n")
}

// Create a file named .env and add the environment variable inName=inValue
if err := ioutil.WriteFile(envFile, []byte(envs.String()), os.ModePerm); err != nil {
return err
}

return nil
Expand Down
33 changes: 1 addition & 32 deletions pkg/formula/runner/docker/runner_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,6 @@ func TestRun(t *testing.T) {
preRun formula.PreRunner
inputResolver formula.InputResolver
env env.Finder
fileManager stream.FileWriteExistAppendRemover
}

type out struct {
Expand All @@ -89,7 +88,6 @@ func TestRun(t *testing.T) {
def: formula.Definition{Path: "testing/formula", RepoName: "commons"},
preRun: preRunner,
inputResolver: inputResolver,
fileManager: fileManager,
env: envFinder,
},
out: out{
Expand All @@ -102,7 +100,6 @@ func TestRun(t *testing.T) {
def: formula.Definition{Path: "testing/formula", RepoName: "commons"},
preRun: preRunner,
inputResolver: inputResolverMock{err: runner.ErrInputNotRecognized},
fileManager: fileManager,
env: envFinder,
},
out: out{
Expand All @@ -115,46 +112,18 @@ func TestRun(t *testing.T) {
def: formula.Definition{Path: "testing/formula", RepoName: "commons"},
preRun: preRunnerMock{err: errors.New("pre runner error")},
inputResolver: inputResolver,
fileManager: fileManager,
env: envFinder,
},
out: out{
err: errors.New("pre runner error"),
},
},
{
name: "run docker write .env error",
in: in{
def: formula.Definition{Path: "testing/formula", RepoName: "commons"},
preRun: preRunner,
inputResolver: inputResolver,
fileManager: fileManagerMock{wErr: errors.New("error to write env file")},
env: envFinder,
},
out: out{
err: errors.New("error to write env file"),
},
},
{
name: "Run docker append .env error",
in: in{
def: formula.Definition{Path: "testing/formula", RepoName: "commons"},
preRun: preRunner,
inputResolver: inputResolver,
fileManager: fileManagerMock{exist: true, aErr: errors.New("error to append env file")},
env: envFinder,
},
out: out{
err: errors.New("error to append env file"),
},
},
{
name: "env find error",
in: in{
def: formula.Definition{Path: "testing/formula", RepoName: "commons"},
preRun: preRunner,
inputResolver: inputResolver,
fileManager: fileManagerMock{exist: true, aErr: errors.New("error to append env file")},
env: envFinderMock{err: errors.New("env not found")},
},
out: out{
Expand All @@ -170,7 +139,7 @@ func TestRun(t *testing.T) {
_ = os.Chdir(formulaPath)

in := tt.in
docker := NewRunner(in.inputResolver, in.preRun, in.fileManager, in.env, homeDir)
docker := NewRunner(homeDir, in.inputResolver, in.preRun, in.env)
got := docker.Run(in.def, api.Prompt, false, nil)

if got != nil || tt.out.err != nil {
Expand Down
48 changes: 43 additions & 5 deletions pkg/formula/runner/local/runner.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,12 @@ import (
"path/filepath"
"strconv"

"github.com/ZupIT/ritchie-cli/pkg/env"

"github.com/spf13/pflag"

"github.com/ZupIT/ritchie-cli/pkg/env"
"github.com/ZupIT/ritchie-cli/pkg/os/osutil"
"github.com/ZupIT/ritchie-cli/pkg/slice/sliceutil"

"github.com/ZupIT/ritchie-cli/pkg/api"
"github.com/ZupIT/ritchie-cli/pkg/formula"
"github.com/ZupIT/ritchie-cli/pkg/metric"
Expand All @@ -39,15 +41,15 @@ var _ formula.Runner = RunManager{}
type RunManager struct {
formula.InputResolver
formula.PreRunner
file stream.FileWriteExistAppendRemover
file stream.FileListMover
env env.Finder
homeDir string
}

func NewRunner(
input formula.InputResolver,
preRun formula.PreRunner,
file stream.FileWriteExistAppendRemover,
file stream.FileListMover,
env env.Finder,
homeDir string,
) formula.Runner {
Expand Down Expand Up @@ -85,11 +87,47 @@ func (ru RunManager) Run(def formula.Definition, inputType api.TermInputType, ve
return err
}

metric.RepoName = def.RepoName

if osutil.IsWindows() {
if err := ru.runWin(cmd, setup); err != nil {
return err
}

return nil
}

if err := cmd.Run(); err != nil {
return err
}

metric.RepoName = def.RepoName
return nil
}

func (ru RunManager) runWin(cmd *exec.Cmd, setup formula.Setup) error {
if err := os.Chdir(setup.BinPath); err != nil {
return err
}

of, err := ru.file.List(setup.BinPath)
if err != nil {
return err
}

if err := cmd.Run(); err != nil {
return err
}

nf, err := ru.file.List(setup.BinPath)
if err != nil {
return err
}

files := append(of, nf...)
newFiles := sliceutil.Unique(files)
if err := ru.file.Move(setup.BinPath, setup.Pwd, newFiles); err != nil {
return err
}

return nil
}
Expand Down
6 changes: 6 additions & 0 deletions pkg/os/osutil/os.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,14 @@

package osutil

import "runtime"

const (
Darwin = "darwin"
Linux = "linux"
Windows = "windows"
)

func IsWindows() bool {
return runtime.GOOS == Windows
}
23 changes: 23 additions & 0 deletions pkg/slice/sliceutil/slice_util.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,26 @@ func Contains(aa []string, s string) bool {
}
return false
}

// Unique returns a slice that contains
// only non repeated values.
func Unique(aa []string) []string {
check := make(map[string]int)
for _, v := range aa {
if check[v] == 1 {
check[v]++
continue
}

check[v] = 1
}

var res []string
for _, v := range aa {
if check[v] == 1 {
res = append(res, v)
}
}

return res
}
7 changes: 7 additions & 0 deletions pkg/slice/sliceutil/slice_util_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,10 @@ func TestContains(t *testing.T) {
})
}
}

func TestUnique(t *testing.T) {
aa := []string{"Dockerfile", "run.sh", "Dockerfile", "run.sh", "docker-compose.yml"}
unique := Unique(aa)
assert.Len(t, unique, 1)
assert.Equal(t, unique[0], "docker-compose.yml")
}
5 changes: 5 additions & 0 deletions pkg/stream/file.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,11 @@ type FileNewListMoveRemover interface {
FileNewLister
}

type FileListMover interface {
FileLister
FileMover
}

type FileCopyExistListerWriter interface {
FileLister
FileCopier
Expand Down

0 comments on commit 6b23eca

Please sign in to comment.