forked from Masterminds/glide
/
update_references.go
112 lines (98 loc) · 2.65 KB
/
update_references.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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package cmd
import (
"path"
"github.com/Masterminds/cookoo"
"github.com/Masterminds/glide/yaml"
)
// UpdateReferences updates the revision numbers on all of the imports.
//
// If a `packages` list is supplied, only the given base packages will
// be updated.
//
// Params:
// - conf (*yaml.Config): Configuration
// - packages ([]string): A list of packages to update. Default is all packages.
func UpdateReferences(c cookoo.Context, p *cookoo.Params) (interface{}, cookoo.Interrupt) {
cfg := p.Get("conf", &yaml.Config{}).(*yaml.Config)
plist := p.Get("packages", []string{}).([]string)
vend, _ := VendorPath(c)
pkgs := list2map(plist)
restrict := len(pkgs) > 0
cwd, err := VendorPath(c)
if err != nil {
return false, err
}
if len(cfg.Imports) == 0 {
return cfg, nil
}
// Walk the dependency tree to discover all the packages to pin.
packages := make([]string, len(cfg.Imports))
for i, v := range cfg.Imports {
packages[i] = v.Name
}
deps := make(map[string]*yaml.Dependency, len(cfg.Imports))
for _, imp := range cfg.Imports {
deps[imp.Name] = imp
}
f := &flattening{cfg, vend, vend, deps, packages}
err = discoverDependencyTree(f)
if err != nil {
return cfg, err
}
exportFlattenedDeps(cfg, deps)
err = cfg.DeDupe()
if err != nil {
return cfg, err
}
for _, imp := range cfg.Imports {
if restrict && !pkgs[imp.Name] {
Debug("===> Skipping %q", imp.Name)
continue
}
commit, err := VcsLastCommit(imp, cwd)
if err != nil {
Warn("Could not get commit on %s: %s", imp.Name, err)
}
imp.Reference = commit
}
return cfg, nil
}
func discoverDependencyTree(f *flattening) error {
Debug("---> Inspecting %s for dependencies (%d packages).\n", f.curr, len(f.scan))
for _, imp := range f.scan {
Debug("----> Scanning %s", imp)
base := path.Join(f.top, imp)
mod := []string{}
if m, ok := mergeGlide(base, imp, f.deps, f.top); ok {
mod = m
} else if m, ok = mergeGodep(base, imp, f.deps, f.top); ok {
mod = m
} else if m, ok = mergeGPM(base, imp, f.deps, f.top); ok {
mod = m
} else if m, ok = mergeGb(base, imp, f.deps, f.top); ok {
mod = m
} else if m, ok = mergeGuess(base, imp, f.deps, f.top); ok {
mod = m
}
if len(mod) > 0 {
Debug("----> Looking for dependencies in %q (%d)", imp, len(mod))
f2 := &flattening{
conf: f.conf,
top: f.top,
curr: base,
deps: f.deps,
scan: mod}
discoverDependencyTree(f2)
}
}
return nil
}
// list2map takes a list of packages names and creates a map of normalized names.
func list2map(in []string) map[string]bool {
out := make(map[string]bool, len(in))
for _, v := range in {
v, _ := NormalizeName(v)
out[v] = true
}
return out
}