node := &modGraphNode{m: m}
mu.Lock()
modGraph[m] = node
- if v, ok := min[m.Path]; !ok || reqs.Max(v, m.Version) != v {
- min[m.Path] = m.Version
+ if m.Version != "none" {
+ if v, ok := min[m.Path]; !ok || reqs.Max(v, m.Version) != v {
+ min[m.Path] = m.Version
+ }
}
mu.Unlock()
- required, err := reqs.Required(m)
- if err != nil {
- setErr(node, err)
- return
- }
- node.required = required
- for _, r := range node.required {
- if r.Version != "none" {
+ if m.Version != "none" {
+ required, err := reqs.Required(m)
+ if err != nil {
+ setErr(node, err)
+ return
+ }
+ node.required = required
+ for _, r := range node.required {
work.Add(r)
}
}
if err != nil {
return nil, err
}
- // TODO: Maybe if an error is given,
- // rerun with BuildList(upgrade[0], reqs) etc
- // to find which ones are the buggy ones.
+
+ pathInList := make(map[string]bool, len(list))
+ for _, m := range list {
+ pathInList[m.Path] = true
+ }
list = append([]module.Version(nil), list...)
- list = append(list, upgrade...)
- return BuildList(target, &override{target, list, reqs})
+
+ upgradeTo := make(map[string]string, len(upgrade))
+ for _, u := range upgrade {
+ if !pathInList[u.Path] {
+ list = append(list, module.Version{Path: u.Path, Version: "none"})
+ }
+ if prev, dup := upgradeTo[u.Path]; dup {
+ upgradeTo[u.Path] = reqs.Max(prev, u.Version)
+ } else {
+ upgradeTo[u.Path] = u.Version
+ }
+ }
+
+ return buildList(target, &override{target, list, reqs}, func(m module.Version) (module.Version, error) {
+ if v, ok := upgradeTo[m.Path]; ok {
+ return module.Version{Path: m.Path, Version: v}, nil
+ }
+ return m, nil
+ })
}
// Downgrade returns a build list for the target module