homemaker/macro.go

70 lines
1.6 KiB
Go
Raw Normal View History

2015-07-20 04:55:24 +00:00
/*
* Copyright (c) 2015 Alex Yatskov <alex@foosoft.net>
all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package main
import (
"fmt"
"log"
"os"
"os/exec"
"strings"
)
2015-07-20 04:55:52 +00:00
type macroDef struct {
2015-07-20 04:55:24 +00:00
Prefix []string
Suffix []string
}
2015-07-20 04:55:52 +00:00
func (m macroDef) process(dir string, params []string, flags int) error {
2015-07-20 06:25:22 +00:00
args := appendExpEnv(nil, m.Prefix)
2015-07-20 04:55:24 +00:00
args = appendExpEnv(args, params)
args = appendExpEnv(args, m.Suffix)
var cmd *exec.Cmd
switch {
case len(args) == 0:
return fmt.Errorf("macro element is invalid")
case len(args) == 1:
cmd = exec.Command(args[0])
default:
cmd = exec.Command(args[0], args[1:]...)
}
cmd.Dir = dir
cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout
cmd.Stdin = os.Stdin
if flags&flagVerbose == flagVerbose {
log.Printf("executing macro %s", strings.Join(args, " "))
}
return cmd.Run()
}
2015-07-20 06:25:22 +00:00
type macro []string
func (m macro) process(dir string, conf *config, flags int) error {
if len(m) == 0 {
return fmt.Errorf("macro element is invalid")
}
macro, ok := conf.Macros[m[0]]
if !ok {
return fmt.Errorf("macro dependency not found %s", m[0])
}
return macro.process(dir, m[1:], flags)
}