Fixed #287: When file or directory not found provide useful message
When a file or directory message is present it usually means a
subpackage is not present due to a version conflict. Noting this
with directions.
diff --git a/dependency/resolver.go b/dependency/resolver.go
index edcc13c..b79da2c 100644
--- a/dependency/resolver.go
+++ b/dependency/resolver.go
@@ -2,6 +2,7 @@
import (
"container/list"
+ "errors"
"runtime"
"sort"
//"go/build"
@@ -502,8 +503,9 @@
continue
}
} else if err != nil {
+ errStr := err.Error()
msg.Debug("ImportDir error on %s: %s", r.Handler.PkgPath(dep), err)
- if strings.HasPrefix(err.Error(), "no buildable Go source") {
+ if strings.HasPrefix(errStr, "no buildable Go source") {
msg.Debug("No subpackages declared. Skipping %s.", dep)
continue
} else if os.IsNotExist(err) && !foundErr && !foundQ {
@@ -530,6 +532,16 @@
// see if this is on GOPATH and copy it?
msg.Info("Not found in vendor/: %s (1)", dep)
}
+ } else if strings.Contains(errStr, "no such file or directory") {
+ r.hadError[dep] = true
+ msg.Err("Error scanning %s: %s", dep, err)
+ msg.Err("This error means the referenced package was not found.")
+ msg.Err("Missing file or directory errors usually occur when multiple packages")
+ msg.Err("share a common dependency and the first reference encountered by the scanner")
+ msg.Err("sets the version to one that does not contain a subpackage needed required")
+ msg.Err("by another package that uses the shared dependency. Try setting a")
+ msg.Err("version in your glide.yaml that works for all packages that share this")
+ msg.Err("dependency.")
} else {
r.hadError[dep] = true
msg.Err("Error scanning %s: %s", dep, err)
@@ -576,10 +588,10 @@
r.VersionHandler.SetVersion(imp, addTest)
} else if err != nil {
r.hadError[dep] = true
- msg.Warn("Error looking for %s: %s", imp, err)
+ msg.Err("Error looking for %s: %s", imp, err)
} else {
r.hadError[dep] = true
- msg.Info("Not found: %s (2)", imp)
+ msg.Err("Not found: %s (2)", imp)
}
case LocGopath:
msg.Debug("Found on GOPATH, not vendor: %s", imp)
@@ -596,6 +608,11 @@
}
+ if len(r.hadError) > 0 {
+ // Errors occured so we return.
+ return []string{}, errors.New("Error resolving imports")
+ }
+
// FIXME: From here to the end is a straight copy of the resolveList() func.
res := make([]string, 0, queue.Len())