Fixed pin file generation. - Does the entire tree rather than just the top level. Pins all the things. - Removes the top level project if it shows up in the recursive dependeinces so it's not placed in the vendor folder.
diff --git a/cmd/flatten.go b/cmd/flatten.go index e9bdcaa..652b522 100644 --- a/cmd/flatten.go +++ b/cmd/flatten.go
@@ -56,6 +56,13 @@ f := &flattening{conf, vend, vend, deps, packages} err := recFlatten(f, force, home, cache, cacheGopath, skipGopath) + if err != nil { + return conf, err + } + err = conf.DeDupe() + if err != nil { + return conf, err + } flattenSetRefs(f) Info("Project relies on %d dependencies.", len(deps)) @@ -134,6 +141,11 @@ func flattenGlideUp(f *flattening, base, home string, force, cache, cacheGopath, skipGopath bool) error { //vdir := path.Join(base, "vendor") for _, imp := range f.deps { + // If the top package name in the glide.yaml file is present in the deps + // skip it because we already have it. + if imp.Name == f.conf.Name { + continue + } wd := path.Join(f.top, imp.Name) if VcsExists(imp, wd) { if updateCache[imp.Name] {
diff --git a/cmd/update_references.go b/cmd/update_references.go index 33c8eeb..c81a95c 100644 --- a/cmd/update_references.go +++ b/cmd/update_references.go
@@ -1,6 +1,8 @@ package cmd import ( + "path" + "github.com/Masterminds/cookoo" "github.com/Masterminds/glide/yaml" ) @@ -16,7 +18,7 @@ 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 @@ -29,6 +31,28 @@ 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) @@ -44,6 +68,39 @@ 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))
diff --git a/yaml/yaml.go b/yaml/yaml.go index d88ac65..5648e22 100644 --- a/yaml/yaml.go +++ b/yaml/yaml.go
@@ -56,11 +56,7 @@ } } - c.Imports, err = c.Imports.DeDupe() - if err != nil { - return c, err - } - c.DevImports, err = c.DevImports.DeDupe() + c.DeDupe() if err != nil { return c, err } @@ -110,6 +106,43 @@ return false } +func (c *Config) DeDupe() error { + + // Remove duplicates in the imports + var err error + c.Imports, err = c.Imports.DeDupe() + if err != nil { + return err + } + c.DevImports, err = c.DevImports.DeDupe() + if err != nil { + return err + } + + // If the name on the config object is part of the imports remove it. + found := -1 + for i, dep := range c.Imports { + if dep.Name == c.Name { + found = i + } + } + if found >= 0 { + c.Imports = append(c.Imports[:found], c.Imports[found+1:]...) + } + + found = -1 + for i, dep := range c.DevImports { + if dep.Name == c.Name { + found = i + } + } + if found >= 0 { + c.Imports = append(c.DevImports[:found], c.DevImports[found+1:]...) + } + + return nil +} + // GetRoot follows the Parent down to the top node func (c *Config) GetRoot() *Config { if c.Parent != nil {