diff --git a/source/dub/dependencyresolver.d b/source/dub/dependencyresolver.d index 3829edc..3635e58 100644 --- a/source/dub/dependencyresolver.d +++ b/source/dub/dependencyresolver.d @@ -86,7 +86,7 @@ package_names[pidx] = basepack; } - configs = getSpecificConfigs(ch) ~ configs; + configs = getSpecificConfigs(basepack, ch) ~ configs; // eliminate configurations from which we know that they can't satisfy // the uniquely defined root dependencies (==version or ~branch style dependencies) @@ -109,7 +109,7 @@ cfgs = cfgs ~ CONFIG.invalid; logDebug("Configurations used for dependency resolution:"); - foreach (n, i; package_indices) logDebug(" %s (%s): %s", n, i, all_configs[i]); + foreach (n, i; package_indices) logDebug(" %s (%s%s): %s", n, i, n in required_deps ? "" : ", optional", all_configs[i]); auto config_indices = new size_t[all_configs.length]; config_indices[] = 0; @@ -225,7 +225,7 @@ } protected abstract CONFIG[] getAllConfigs(string pack); - protected abstract CONFIG[] getSpecificConfigs(TreeNodes nodes); + protected abstract CONFIG[] getSpecificConfigs(string pack, TreeNodes nodes); protected abstract TreeNodes[] getChildren(TreeNode node); protected abstract bool matches(CONFIGS configs, CONFIG config); @@ -293,7 +293,7 @@ ret.data.sort!"a>b"(); return ret.data; } - protected override IntConfig[] getSpecificConfigs(TreeNodes nodes) { return null; } + protected override IntConfig[] getSpecificConfigs(string pack, TreeNodes nodes) { return null; } protected override TreeNodes[] getChildren(TreeNode node) { return m_children.get(node.pack ~ ":" ~ node.config.to!string(), null); } protected override bool matches(IntConfigs configs, IntConfig config) { return configs.canFind(config); } } diff --git a/source/dub/dub.d b/source/dub/dub.d index 403d3e4..afdbd14 100644 --- a/source/dub/dub.d +++ b/source/dub/dub.d @@ -1040,16 +1040,24 @@ if (!(m_options & UpgradeOptions.preRelease)) versions = versions.filter!(v => !v.isPreRelease).array ~ versions.filter!(v => v.isPreRelease).array; + // filter out invalid/unreachable dependency specs + versions = versions.filter!((v) { + bool valid = getPackage(pack, Dependency(v)) !is null; + if (!valid) logDiagnostic("Excluding invalid dependency specification %s %s from dependency resolution process.", pack, v); + return valid; + }).array; + if (!versions.length) logDiagnostic("Nothing found for %s", pack); + else logDiagnostic("Return for %s: %s", pack, versions); auto ret = versions.map!(v => Dependency(v)).array; m_packageVersions[pack] = ret; return ret; } - protected override Dependency[] getSpecificConfigs(TreeNodes nodes) + protected override Dependency[] getSpecificConfigs(string pack, TreeNodes nodes) { - if (!nodes.configs.path.empty) return [nodes.configs]; + if (!nodes.configs.path.empty && getPackage(pack, nodes.configs)) return [nodes.configs]; else return null; }