| 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") | 
 | 	fi, err := os.Stat(path) | 
 | 	return err == nil && !fi.IsDir() | 
 | } | 
 |  | 
 | // 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)) | 
 | 	msg.Info("--> Parsing GB metadata...") | 
 | 	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 { | 
 | 		// TODO(sdboyer) move to the corresponding SourceManager call...though | 
 | 		// that matters less once gps caches these results | 
 | 		pkg, _ := util.NormalizeName(d.Importpath) | 
 | 		if !seen[pkg] { | 
 | 			seen[pkg] = true | 
 | 			dep := &cfg.Dependency{ | 
 | 				Name:       pkg, | 
 | 				Version:    d.Revision, | 
 | 				Repository: d.Repository, | 
 | 			} | 
 | 			buf = append(buf, dep) | 
 | 		} | 
 | 	} | 
 | 	return buf, nil | 
 | } | 
 |  | 
 | // AsMetadataPair attempts to extract manifest and lock data from gb metadata. | 
 | func AsMetadataPair(dir string) (m []*cfg.Dependency, l *cfg.Lockfile, err error) { | 
 | 	path := filepath.Join(dir, "vendor/manifest") | 
 | 	if _, err = os.Stat(path); err != nil { | 
 | 		return | 
 | 	} | 
 |  | 
 | 	file, err := os.Open(path) | 
 | 	if err != nil { | 
 | 		return | 
 | 	} | 
 | 	defer file.Close() | 
 |  | 
 | 	man := Manifest{} | 
 |  | 
 | 	dec := json.NewDecoder(file) | 
 | 	if err = dec.Decode(&man); err != nil { | 
 | 		return | 
 | 	} | 
 |  | 
 | 	seen := map[string]bool{} | 
 |  | 
 | 	for _, d := range man.Dependencies { | 
 | 		pkg, _ := util.NormalizeName(d.Importpath) | 
 | 		if !seen[pkg] { | 
 | 			seen[pkg] = true | 
 | 			dep := &cfg.Dependency{ | 
 | 				Name:       pkg, | 
 | 				Repository: d.Repository, | 
 | 			} | 
 | 			m = append(m, dep) | 
 | 			l.Imports = append(l.Imports, &cfg.Lock{Name: pkg, Revision: d.Revision}) | 
 | 		} | 
 | 	} | 
 | 	return | 
 | } |