Resolve by import usage, not by path.
diff --git a/dependency/resolver.go b/dependency/resolver.go index e08f738..a73a3c6 100644 --- a/dependency/resolver.go +++ b/dependency/resolver.go
@@ -2,6 +2,7 @@ import ( "container/list" + //"go/build" "os" "path/filepath" "strings" @@ -185,7 +186,8 @@ //msg.Debug("Scanning %s", target) l := list.New() l.PushBack(target) - return r.resolveList(l) + //return r.resolveList(l) + return r.resolveImports(l) } // ResolveLocal resolves dependencies for the current project. @@ -251,7 +253,8 @@ } if deep { - return r.resolveList(l) + //return r.resolveList(l) + return r.resolveImports(l) } // If we're not doing a deep scan, we just convert the list into an @@ -280,13 +283,78 @@ return r.resolveList(queue) } +// resolveImports takes a list of existing packages and resolves their imports. +func (r *Resolver) resolveImports(queue *list.List) ([]string, error) { + for e := queue.Front(); e != nil; e = e.Next() { + dep := e.Value.(string) + + // Skip ignored packages + t := strings.TrimPrefix(dep, r.VendorDir+string(os.PathSeparator)) + if r.Config.HasIgnore(t) { + msg.Info("Ignoring: %s", t) + continue + } + r.VersionHandler.Process(t) + + // Here, we want to import the package and see what imports it has. + pkg, err := r.BuildContext.ImportDir(dep, 0) + if err != nil { + msg.Error("Failed to import %s: %s", dep, err) + continue + //return nil, err + } + + for _, imp := range pkg.Imports { + pi := r.FindPkg(imp) + switch pi.Loc { + case LocVendor: + msg.Info("Already vendored: %s", imp) + case LocUnknown: + msg.Info("Not found: %s", imp) + case LocGopath: + msg.Info("Found on GOPATH, not vendor: %s", imp) + } + } + + } + + // FIXME: From here to the end is a straight copy of the resolveList() func. + res := make([]string, 0, queue.Len()) + + // In addition to generating a list + for e := queue.Front(); e != nil; e = e.Next() { + t := strings.TrimPrefix(e.Value.(string), r.VendorDir+string(os.PathSeparator)) + root, sp := util.NormalizeName(t) + + // TODO(mattfarina): Need to eventually support devImport + existing := r.Config.Imports.Get(root) + if existing != nil { + if sp != "" && !existing.HasSubpackage(sp) { + existing.Subpackages = append(existing.Subpackages, sp) + } + } else { + newDep := &cfg.Dependency{ + Name: root, + } + if sp != "" { + newDep.Subpackages = []string{sp} + } + + r.Config.Imports = append(r.Config.Imports, newDep) + } + res = append(res, e.Value.(string)) + } + + return res, nil +} + // resolveList takes a list and resolves it. func (r *Resolver) resolveList(queue *list.List) ([]string, error) { var failedDep string for e := queue.Front(); e != nil; e = e.Next() { dep := e.Value.(string) - t := strings.TrimPrefix(e.Value.(string), r.VendorDir+string(os.PathSeparator)) + t := strings.TrimPrefix(dep, r.VendorDir+string(os.PathSeparator)) if r.Config.HasIgnore(t) { msg.Info("Ignoring: %s", t) continue
diff --git a/dependency/resolver_test.go b/dependency/resolver_test.go index 0edb764..d73ede5 100644 --- a/dependency/resolver_test.go +++ b/dependency/resolver_test.go
@@ -72,6 +72,10 @@ if len(l) != 1 { t.Errorf("Expected 1 dep, got %d: %s", len(l), l[0]) } + + if strings.HasSuffix("github.com/codegangsta/cli", l[0]) { + t.Errorf("Unexpected package name: %s", l[0]) + } } func TestResolveAll(t *testing.T) {