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