| /* Package godep provides basic importing of Godep dependencies. |
| |
| This is not a complete implementation of Godep. |
| */ |
| package godep |
| |
| import ( |
| "encoding/json" |
| "os" |
| "path/filepath" |
| |
| "github.com/Masterminds/glide/cfg" |
| "github.com/Masterminds/glide/msg" |
| "github.com/Masterminds/glide/util" |
| ) |
| |
| // This file contains commands for working with Godep. |
| |
| // The Godeps struct from Godep. |
| // |
| // https://raw.githubusercontent.com/tools/godep/master/dep.go |
| // |
| // We had to copy this because it's in the package main for Godep. |
| type Godeps struct { |
| ImportPath string |
| GoVersion string |
| Packages []string `json:",omitempty"` // Arguments to save, if any. |
| Deps []GodepDependency |
| |
| outerRoot string |
| } |
| |
| // GodepDependency is a modified version of Godep's Dependency struct. |
| // It drops all of the unexported fields. |
| type GodepDependency struct { |
| ImportPath string |
| Comment string `json:",omitempty"` // Description of commit, if present. |
| Rev string // VCS-specific commit ID. |
| } |
| |
| // Has is a command to detect if a package contains a Godeps.json file. |
| func Has(dir string) bool { |
| path := filepath.Join(dir, "Godeps/Godeps.json") |
| _, err := os.Stat(path) |
| return err == nil |
| } |
| |
| // Parse parses a Godep's Godeps file. |
| // |
| // It returns the contents as a dependency array. |
| func Parse(dir string) ([]*cfg.Dependency, error) { |
| path := filepath.Join(dir, "Godeps/Godeps.json") |
| if _, err := os.Stat(path); err != nil { |
| return []*cfg.Dependency{}, nil |
| } |
| msg.Info("Found Godeps.json file.") |
| |
| buf := []*cfg.Dependency{} |
| |
| godeps := &Godeps{} |
| |
| // Get a handle to the file. |
| file, err := os.Open(path) |
| if err != nil { |
| return buf, err |
| } |
| defer file.Close() |
| |
| dec := json.NewDecoder(file) |
| if err := dec.Decode(godeps); err != nil { |
| return buf, err |
| } |
| |
| seen := map[string]bool{} |
| for _, d := range godeps.Deps { |
| pkg, sub := util.NormalizeName(d.ImportPath) |
| if _, ok := seen[pkg]; ok { |
| if len(sub) == 0 { |
| continue |
| } |
| // Modify existing dep with additional subpackages. |
| for _, dep := range buf { |
| if dep.Name == pkg { |
| dep.Subpackages = append(dep.Subpackages, sub) |
| } |
| } |
| } else { |
| seen[pkg] = true |
| dep := &cfg.Dependency{Name: pkg, Reference: d.Rev} |
| if sub != "" { |
| dep.Subpackages = []string{sub} |
| } |
| buf = append(buf, dep) |
| } |
| } |
| |
| return buf, nil |
| } |