private bool PickNextLine(ResolverLine line, List<Dependency> resolved, int depth)
        {
            Log.Trace("Resolving down graph to depth " + depth);
            if (depth > RecursionLimitDepth) {
                throw new ResolverException(ResolverException.InfiniteRecursion + ", in depth");
            }
            var nodePosition = 0;
            for (var nextLine = line.PickNextLine(); nextLine!=null; nextLine = line.PickNextLine()) {
                Log.Debug("picked next line at position " + nodePosition  + " at depth " + depth);
                nodePosition++;

                if (nodePosition > RecursionLimitWidth) {
                    throw new ResolverException(ResolverException.InfiniteRecursion + ", in sideways traverse");
                }
                if (nextLine.IsAllResolved()) {
                    Log.Debug("Line resolved, collecting results");
                    var found = nextLine.FindAllResolved();
                    resolved.AddRange(found);
                    return true;
                } else {
                    Log.Trace("try to pick a version and walk down");
                    if (PickNextLine(nextLine, resolved, depth + 1)) {
                        return true;
                    } else {
                        Log.Trace("Couldn't resolve by picking a version, trying sideways at depth " + depth + " position " + nodePosition);
                    }
                }
            }
            return false;
        }
        public List<Dependency> Resolve(IList<Wish> require)
        {
            //todo:extract transitive
            foreach (var wish in require) {
                Log.Trace("require : " + wish.SafeToSummary());
            }
            var root = new ResolverLine(m_cache);
            foreach (var wish in require) {
                root.AddWish(wish);
            }

            var resolved = Resolve(root);
            if (Log.IsDebugEnabled()) {
                Log.Debug("resolved dependencies:");
                foreach (var dep in resolved) {
                    Log.Debug(dep.SafeToSummary());
                }
            }
            return resolved;
        }
 private List<Dependency> Resolve(ResolverLine firstLine)
 {
     var resolved = new List<Dependency>();
     firstLine.ResolveWhatCanBe();
     firstLine.CanMatchOrThrow();
     if (firstLine.IsAllResolved()) {
         Log.Debug("line resolved, collecting results");
         resolved = firstLine.FindAllResolved();
     } else {
         if (!PickNextLine(firstLine, resolved, 0)) {
             Log.Info("No solution possible");
             throw new ResolverException(ResolverException.NoSolutions);
         }
     }
     return resolved.OrderBy(d=>d.Group + "-" + d.Name).ToList();
 }