| package gb | 
 |  | 
 | import ( | 
 | 	"encoding/json" | 
 | 	"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 GB-flavored manifest file. | 
 | func Has(dir string) bool { | 
 | 	path := filepath.Join(dir, "vendor/manifest") | 
 | 	_, err := os.Stat(path) | 
 | 	return err == nil | 
 | } | 
 |  | 
 | // Parse parses a GB-flavored manifest file. | 
 | func Parse(dir string) ([]*cfg.Dependency, error) { | 
 | 	path := filepath.Join(dir, "vendor/manifest") | 
 | 	if fi, err := os.Stat(path); err != nil || fi.IsDir() { | 
 | 		return []*cfg.Dependency{}, nil | 
 | 	} | 
 |  | 
 | 	msg.Info("Found GB manifest file in %s", gpath.StripBasepath(dir)) | 
 | 	buf := []*cfg.Dependency{} | 
 | 	file, err := os.Open(path) | 
 | 	if err != nil { | 
 | 		return buf, err | 
 | 	} | 
 | 	defer file.Close() | 
 |  | 
 | 	man := Manifest{} | 
 |  | 
 | 	dec := json.NewDecoder(file) | 
 | 	if err := dec.Decode(&man); err != nil { | 
 | 		return buf, err | 
 | 	} | 
 |  | 
 | 	seen := map[string]bool{} | 
 |  | 
 | 	for _, d := range man.Dependencies { | 
 | 		pkg, sub := util.NormalizeName(d.Importpath) | 
 | 		if _, ok := seen[pkg]; ok { | 
 | 			if len(sub) == 0 { | 
 | 				continue | 
 | 			} | 
 | 			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.Revision, | 
 | 				Repository: d.Repository, | 
 | 			} | 
 | 			if len(sub) > 0 { | 
 | 				dep.Subpackages = []string{sub} | 
 | 			} | 
 | 			buf = append(buf, dep) | 
 | 		} | 
 | 	} | 
 | 	return buf, nil | 
 | } |