Fixed #615: There was a way Glide could get stuck in a resolver loop The resolver loop caused Kubernetes imports to fail.
diff --git a/dependency/resolver.go b/dependency/resolver.go index a9dfada..578f2b1 100644 --- a/dependency/resolver.go +++ b/dependency/resolver.go
@@ -460,12 +460,19 @@ return []string{}, nil } + alreadySeen := map[string]bool{} + for e := queue.Front(); e != nil; e = e.Next() { vdep := e.Value.(string) dep := r.Stripv(vdep) // Check if marked in the Q and then explicitly mark it. We want to know // if it had previously been marked and ensure it for the future. + if alreadySeen[dep] { + continue + } + alreadySeen[dep] = true + _, foundQ := r.alreadyQ[dep] r.alreadyQ[dep] = true @@ -518,6 +525,7 @@ // If the location doesn't exist try to fetch it. if ok, err2 := r.Handler.NotFound(dep, addTest); ok { r.alreadyQ[dep] = true + alreadySeen[dep] = false // By adding to the queue it will get reprocessed now that // it exists. @@ -572,7 +580,7 @@ msg.Debug("In vendor: %s", imp) if _, ok := r.alreadyQ[imp]; !ok { msg.Debug("Marking %s to be scanned.", imp) - r.alreadyQ[dep] = true + r.alreadyQ[imp] = true queue.PushBack(r.vpath(imp)) if err := r.Handler.InVendor(imp, addTest); err == nil { r.VersionHandler.SetVersion(imp, addTest) @@ -583,14 +591,14 @@ case LocUnknown: msg.Debug("Missing %s. Trying to resolve.", imp) if ok, err := r.Handler.NotFound(imp, addTest); ok { - r.alreadyQ[dep] = true + r.alreadyQ[imp] = true queue.PushBack(r.vpath(imp)) r.VersionHandler.SetVersion(imp, addTest) } else if err != nil { - r.hadError[dep] = true + r.hadError[imp] = true msg.Err("Error looking for %s: %s", imp, err) } else { - r.hadError[dep] = true + r.hadError[imp] = true msg.Err("Not found: %s (2)", imp) } case LocGopath: @@ -598,7 +606,7 @@ if _, ok := r.alreadyQ[imp]; !ok { // Only scan it if it gets moved into vendor/ if ok, _ := r.Handler.OnGopath(imp, addTest); ok { - r.alreadyQ[dep] = true + r.alreadyQ[imp] = true queue.PushBack(r.vpath(imp)) r.VersionHandler.SetVersion(imp, addTest) }