diff --git a/source/dub/dependency.d b/source/dub/dependency.d index 0f1bfee..9b549ba 100644 --- a/source/dub/dependency.d +++ b/source/dub/dependency.d @@ -128,6 +128,16 @@ enforce(m_versA == m_versB, "Dependency "~toString()~" is no exact version."); return m_versA; } + + Dependency mapToPath(Path path) + const { + if (m_path.empty || m_path.absolute) return this; + else { + Dependency ret = this; + ret.path = path ~ ret.path; + return ret; + } + } string toString() const { @@ -255,6 +265,7 @@ if (m_versA.isBranch != o.m_versA.isBranch) return INVALID; if (m_versB.isBranch != o.m_versB.isBranch) return INVALID; if (m_versA.isBranch) return m_versA == o.m_versA ? this : INVALID; + if (this.path != o.path) return INVALID; Version a = m_versA > o.m_versA ? m_versA : o.m_versA; Version b = m_versB < o.m_versB ? m_versB : o.m_versB; diff --git a/source/dub/dependencyresolver.d b/source/dub/dependencyresolver.d index 7262e30..0db992a 100644 --- a/source/dub/dependencyresolver.d +++ b/source/dub/dependencyresolver.d @@ -54,16 +54,20 @@ { foreach (ch; getChildren(parent)) { auto basepack = rootPackage(ch.pack); - if (basepack in package_indices) continue; - auto pidx = all_configs.length; - auto configs = getAllConfigs(basepack); - if (!configs.length) { - logDiagnostic("Found no configurations for package %s, referenced by %s %s.", basepack, parent.pack, parent.config); - continue; + CONFIG[] configs; + if (auto pi = basepack in package_indices) { + pidx = *pi; + configs = all_configs[*pi]; + } else { + configs = getAllConfigs(basepack); + all_configs ~= configs; + package_indices[basepack] = pidx; } - all_configs ~= configs; - package_indices[basepack] = pidx; + + configs = getSpecificConfigs(ch) ~ configs; + + all_configs[pidx] = configs; foreach (v; all_configs[pidx]) findConfigsRec(TreeNode(ch.pack, v)); @@ -114,6 +118,7 @@ } protected abstract CONFIG[] getAllConfigs(string pack); + protected abstract CONFIG[] getSpecificConfigs(TreeNodes nodes); protected abstract TreeNodes[] getChildren(TreeNode node); protected abstract bool matches(CONFIGS configs, CONFIG config); } @@ -134,6 +139,7 @@ ret.data.sort!"a>b"(); return ret.data; } + protected override uint[] getSpecificConfigs(TreeModes nodes) { return null; } protected override TreeNodes[] getChildren(TreeNode node) { return m_children.get(node.pack ~ ":" ~ node.config.to!string(), null); } protected override bool matches(uint[] configs, uint config) { return configs.canFind(config); } } diff --git a/source/dub/dub.d b/source/dub/dub.d index ecdc51a..67cc673 100644 --- a/source/dub/dub.d +++ b/source/dub/dub.d @@ -655,6 +655,13 @@ return ret; } + protected override Dependency[] getSpecificConfigs(TreeNodes nodes) + { + if (!nodes.configs.path.empty) return [nodes.configs]; + else return null; + } + + protected override TreeNodes[] getChildren(TreeNode node) { auto ret = appender!(TreeNodes[]); @@ -662,8 +669,10 @@ assert(pack !is null, format("Invalid package: %s %s", node.pack, node.config)); foreach (dname, dspec; pack.dependencies) { auto dbasename = getBasePackage(dname); + if (dspec.optional && !m_dub.packageManager.getFirstPackage(dname)) + continue; if (m_options & UpdateOptions.upgrade || !m_selectedVersions || !m_selectedVersions.hasSelectedVersion(dbasename)) - ret ~= TreeNodes(dname, dspec); + ret ~= TreeNodes(dname, dspec.mapToPath(pack.path)); else ret ~= TreeNodes(dname, m_selectedVersions.selectedVersion(dbasename)); } return ret.data; @@ -671,11 +680,17 @@ protected override bool matches(Dependency configs, Dependency config) { + if (!configs.path.empty) return configs.path == config.path; return configs.merge(config).valid; } private Package getPackage(string name, Dependency dep) { + if (!dep.path.empty) { + auto ret = m_dub.packageManager.getOrLoadPackage(dep.path); + if (dep.matches(ret.ver)) return ret; + } + if (auto ret = m_dub.m_packageManager.getBestPackage(name, dep)) return ret;