blob: 51910b0f3a54ea6a1bc3bdd039dc010ab2100a26 [file] [log] [blame]
package gom
import (
"errors"
"os"
"path/filepath"
"github.com/Masterminds/glide/cfg"
"github.com/Masterminds/glide/msg"
gpath "github.com/Masterminds/glide/path"
"github.com/Masterminds/glide/util"
)
// Has returns true if this dir has a Gomfile.
func Has(dir string) bool {
path := filepath.Join(dir, "Gomfile")
fi, err := os.Stat(path)
return err == nil && !fi.IsDir()
}
// Parse parses a Gomfile.
func Parse(dir string) ([]*cfg.Dependency, error) {
path := filepath.Join(dir, "Gomfile")
if fi, err := os.Stat(path); err != nil || fi.IsDir() {
return []*cfg.Dependency{}, nil
}
msg.Info("Found Gomfile in %s", gpath.StripBasepath(dir))
msg.Info("--> Parsing Gomfile metadata...")
buf := []*cfg.Dependency{}
goms, err := parseGomfile(path)
if err != nil {
return []*cfg.Dependency{}, err
}
for _, gom := range goms {
// Do we need to skip this dependency?
if val, ok := gom.options["skipdep"]; ok && val.(string) == "true" {
continue
}
// Check for custom cloning command
if _, ok := gom.options["command"]; ok {
return []*cfg.Dependency{}, errors.New("Glide does not support custom Gomfile commands")
}
// Check for groups/environments
if val, ok := gom.options["group"]; ok {
groups := toStringSlice(val)
if !stringsContain(groups, "development") && !stringsContain(groups, "production") {
// right now we only support development and production
msg.Info("Skipping dependency '%s' because it isn't in the development or production group", gom.name)
continue
}
}
pkg, sub := util.NormalizeName(gom.name)
dep := &cfg.Dependency{
Name: pkg,
}
if len(sub) > 0 {
dep.Subpackages = []string{sub}
}
// Check for a specific revision
if val, ok := gom.options["commit"]; ok {
dep.Reference = val.(string)
}
if val, ok := gom.options["tag"]; ok {
dep.Reference = val.(string)
}
if val, ok := gom.options["branch"]; ok {
dep.Reference = val.(string)
}
// Parse goos and goarch
if val, ok := gom.options["goos"]; ok {
dep.Os = toStringSlice(val)
}
if val, ok := gom.options["goarch"]; ok {
dep.Arch = toStringSlice(val)
}
buf = append(buf, dep)
}
return buf, nil
}
func stringsContain(v []string, key string) bool {
for _, s := range v {
if s == key {
return true
}
}
return false
}
func toStringSlice(v interface{}) []string {
if v, ok := v.(string); ok {
return []string{v}
}
if v, ok := v.([]string); ok {
return v
}
return []string{}
}