|  | 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{} | 
|  | } |