|  | // Package gpm reads GPM's Godeps files. | 
|  | // | 
|  | // It is not a complete implementaton of GPM. | 
|  | package gpm | 
|  |  | 
|  | import ( | 
|  | "bufio" | 
|  | "os" | 
|  | "path/filepath" | 
|  | "strings" | 
|  |  | 
|  | "github.com/Masterminds/glide/cfg" | 
|  | "github.com/Masterminds/glide/msg" | 
|  | gpath "github.com/Masterminds/glide/path" | 
|  | ) | 
|  |  | 
|  | // Has indicates whether a Godeps file exists. | 
|  | func Has(dir string) bool { | 
|  | path := filepath.Join(dir, "Godeps") | 
|  | _, err := os.Stat(path) | 
|  | return err == nil | 
|  | } | 
|  |  | 
|  | // Parse parses a GPM-flavored Godeps file. | 
|  | func Parse(dir string) ([]*cfg.Dependency, error) { | 
|  | path := filepath.Join(dir, "Godeps") | 
|  | if i, err := os.Stat(path); err != nil { | 
|  | return []*cfg.Dependency{}, nil | 
|  | } else if i.IsDir() { | 
|  | msg.Info("Godeps is a directory. This is probably a Godep project.\n") | 
|  | return []*cfg.Dependency{}, nil | 
|  | } | 
|  | msg.Info("Found Godeps file in %s", gpath.StripBasepath(dir)) | 
|  | msg.Info("--> Parsing GPM metadata...") | 
|  |  | 
|  | buf := []*cfg.Dependency{} | 
|  |  | 
|  | file, err := os.Open(path) | 
|  | if err != nil { | 
|  | return buf, err | 
|  | } | 
|  | scanner := bufio.NewScanner(file) | 
|  | for scanner.Scan() { | 
|  | parts, ok := parseGodepsLine(scanner.Text()) | 
|  | if ok { | 
|  | dep := &cfg.Dependency{Name: parts[0]} | 
|  | if len(parts) > 1 { | 
|  | dep.Reference = parts[1] | 
|  | } | 
|  | buf = append(buf, dep) | 
|  | } | 
|  | } | 
|  | if err := scanner.Err(); err != nil { | 
|  | msg.Warn("Scan failed: %s\n", err) | 
|  | return buf, err | 
|  | } | 
|  |  | 
|  | return buf, nil | 
|  | } | 
|  |  | 
|  | func parseGodepsLine(line string) ([]string, bool) { | 
|  | line = strings.TrimSpace(line) | 
|  |  | 
|  | if len(line) == 0 || strings.HasPrefix(line, "#") { | 
|  | return []string{}, false | 
|  | } | 
|  |  | 
|  | return strings.Fields(line), true | 
|  | } |