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  }