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