github.com/bilus/oya@v0.0.3-0.20190301162104-da4acbd394c6/cmd/internal/run.go (about) 1 package internal 2 3 import ( 4 "io" 5 "regexp" 6 "strings" 7 8 "github.com/bilus/oya/pkg/project" 9 "github.com/bilus/oya/pkg/task" 10 "github.com/bilus/oya/pkg/template" 11 ) 12 13 func Run(workDir, taskName string, recurse, changeset bool, positionalArgs []string, flags map[string]string, stdout, stderr io.Writer) error { 14 installDir, err := installDir() 15 if err != nil { 16 return err 17 } 18 p, err := project.Detect(workDir, installDir) 19 if err != nil { 20 return err 21 } 22 err = p.InstallPacks() 23 if err != nil { 24 return err 25 } 26 values, err := p.Values() 27 if err != nil { 28 return err 29 } 30 tn := task.Name(taskName) 31 32 alias, _ := tn.Split() 33 oldOyaScope, _ := lookupOyaScope() 34 if err := setOyaScope(alias.String()); err != nil { 35 return err 36 } 37 defer setOyaScope(oldOyaScope) // Mostly useful in tests, child processes naturally implement stacks. 38 39 return p.Run(workDir, tn, recurse, changeset, toScope(positionalArgs, flags).Merge(values), stdout, stderr) 40 } 41 42 func toScope(positionalArgs []string, flags map[string]string) template.Scope { 43 return template.Scope{ 44 "Args": positionalArgs, 45 "Flags": camelizeFlags(flags), 46 } 47 } 48 49 func camelizeFlags(flags map[string]string) map[string]string { 50 result := make(map[string]string) 51 for k, v := range flags { 52 result[camelize(k)] = v 53 } 54 return result 55 } 56 57 var sepRx = regexp.MustCompile("(-|_).") 58 59 // camelize turns - or _ separated identifiers into camel case. 60 // Example: "aa-bb" becomes "aaBb". 61 func camelize(s string) string { 62 return sepRx.ReplaceAllStringFunc(s, func(match string) string { 63 return strings.ToUpper(match[1:]) 64 }) 65 66 }