github.com/goguardian/glide@v0.0.0-20160311175917-84255172e124/gb/gb.go (about) 1 package gb 2 3 import ( 4 "encoding/json" 5 "os" 6 "path/filepath" 7 8 "github.com/Masterminds/glide/cfg" 9 "github.com/Masterminds/glide/msg" 10 "github.com/Masterminds/glide/util" 11 ) 12 13 // Has returns true if this dir has a GB-flavored manifest file. 14 func Has(dir string) bool { 15 path := filepath.Join(dir, "vendor/manifest") 16 _, err := os.Stat(path) 17 return err == nil 18 } 19 20 // Parse parses a GB-flavored manifest file. 21 func Parse(dir string) ([]*cfg.Dependency, error) { 22 path := filepath.Join(dir, "vendor/manifest") 23 if fi, err := os.Stat(path); err != nil || fi.IsDir() { 24 return []*cfg.Dependency{}, nil 25 } 26 27 msg.Info("Found GB manifest file.\n") 28 buf := []*cfg.Dependency{} 29 file, err := os.Open(path) 30 if err != nil { 31 return buf, err 32 } 33 defer file.Close() 34 35 man := Manifest{} 36 37 dec := json.NewDecoder(file) 38 if err := dec.Decode(&man); err != nil { 39 return buf, err 40 } 41 42 seen := map[string]bool{} 43 44 for _, d := range man.Dependencies { 45 pkg, sub := util.NormalizeName(d.Importpath) 46 if _, ok := seen[pkg]; ok { 47 if len(sub) == 0 { 48 continue 49 } 50 for _, dep := range buf { 51 if dep.Name == pkg { 52 dep.Subpackages = append(dep.Subpackages, sub) 53 } 54 } 55 } else { 56 seen[pkg] = true 57 dep := &cfg.Dependency{ 58 Name: pkg, 59 Reference: d.Revision, 60 Repository: d.Repository, 61 } 62 if len(sub) > 0 { 63 dep.Subpackages = []string{sub} 64 } 65 buf = append(buf, dep) 66 } 67 } 68 return buf, nil 69 }