-
Notifications
You must be signed in to change notification settings - Fork 541
/
Copy pathgb.go
98 lines (83 loc) · 2.18 KB
/
gb.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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
}