diff --git a/source/dub/dependencyresolver.d b/source/dub/dependencyresolver.d index aea79ba..6a292ef 100644 --- a/source/dub/dependencyresolver.d +++ b/source/dub/dependencyresolver.d @@ -10,7 +10,7 @@ import dub.dependency; import dub.internal.vibecompat.core.log; -import std.algorithm : all, canFind, filter, sort; +import std.algorithm : all, canFind, filter, map, sort; import std.array : appender, array; import std.conv : to; import std.exception : enforce; @@ -55,7 +55,7 @@ CONFIG[string] resolve(TreeNode root, bool throw_on_failure = true) { - auto root_base_pack = rootPackage(root.pack); + auto root_base_pack = basePackage(root.pack); // find all possible configurations of each possible dependency size_t[string] package_indices; @@ -71,7 +71,7 @@ visited[parent] = true; foreach (ch; getChildren(parent)) { - auto basepack = rootPackage(ch.pack); + auto basepack = basePackage(ch.pack); auto pidx = all_configs.length; if (ch.depType != DependencyType.required) maybe_optional_deps[ch.pack] = true; @@ -132,12 +132,12 @@ visited[parent] = true; sizediff_t maxcpi = -1; - sizediff_t parentidx = package_indices.get(rootPackage(parent.pack), -1); - auto parentbase = rootPackage(parent.pack); + sizediff_t parentidx = package_indices.get(basePackage(parent.pack), -1); + auto parentbase = basePackage(parent.pack); // loop over all dependencies foreach (ch; getChildren(parent)) { - auto basepack = rootPackage(ch.pack); + auto basepack = basePackage(ch.pack); assert(basepack in package_indices, format("%s not in packages %s", basepack, package_indices)); // get the current config/version of the current dependency @@ -226,7 +226,9 @@ auto cfg = all_configs[i][config_indices[i]]; if (cfg != CONFIG.invalid) ret[p] = cfg; } + logDebug("Resolved dependencies before optional-purge: %s", ret.byKey.map!(k => k~" "~ret[k].to!string)); purgeOptionalDependencies(root, ret); + logDebug("Resolved dependencies after optional-purge: %s", ret.byKey.map!(k => k~" "~ret[k].to!string)); return ret; } @@ -255,9 +257,9 @@ void markRecursively(TreeNode node) { if (node.pack in required) return; - required[node.pack] = true; + required[basePackage(node.pack)] = true; foreach (dep; getChildren(node).filter!(dep => dep.depType != DependencyType.optional)) - if (auto dp = rootPackage(dep.pack) in configs) + if (auto dp = basePackage(dep.pack) in configs) markRecursively(TreeNode(dep.pack, *dp)); } @@ -277,7 +279,7 @@ optional } -private string rootPackage(string p) +private string basePackage(string p) { auto idx = indexOf(p, ":"); if (idx < 0) return p; diff --git a/source/dub/project.d b/source/dub/project.d index 79f93e7..850775c 100644 --- a/source/dub/project.d +++ b/source/dub/project.d @@ -296,12 +296,13 @@ Package p; auto basename = getBasePackageName(dep.name); + auto subname = getSubPackageName(dep.name); if (dep.name == m_rootPackage.basePackage.name) { vspec = Dependency(m_rootPackage.version_); p = m_rootPackage.basePackage; } else if (basename == m_rootPackage.basePackage.name) { vspec = Dependency(m_rootPackage.version_); - try p = m_packageManager.getSubPackage(m_rootPackage.basePackage, getSubPackageName(dep.name), false); + try p = m_packageManager.getSubPackage(m_rootPackage.basePackage, subname, false); catch (Exception e) { logDiagnostic("%sError getting sub package %s: %s", indent, dep.name, e.msg); continue; @@ -313,12 +314,13 @@ auto path = vspec.path; if (!path.absolute) path = m_rootPackage.path ~ path; p = m_packageManager.getOrLoadPackage(path, Path.init, true); + if (subname.length) p = m_packageManager.getSubPackage(p, subname, true); } } else if (m_dependencies.canFind!(d => getBasePackageName(d.name) == basename)) { auto idx = m_dependencies.countUntil!(d => getBasePackageName(d.name) == basename); auto bp = m_dependencies[idx].basePackage; vspec = Dependency(bp.path); - p = m_packageManager.getSubPackage(bp, getSubPackageName(dep.name), false); + p = m_packageManager.getSubPackage(bp, subname, false); } else { logDiagnostic("%sVersion selection for dependency %s (%s) of %s is missing.", indent, basename, dep.name, pack.name); @@ -333,7 +335,7 @@ logWarn("%sSub package %s must be referenced using the path to it's parent package.", indent, dep.name); p = p.parentPackage; } - if (dep.name.canFind(':')) p = m_packageManager.getSubPackage(p, getSubPackageName(dep.name), false); + if (subname.length) p = m_packageManager.getSubPackage(p, subname, false); enforce(p.name == dep.name, format("Path based dependency %s is referenced with a wrong name: %s vs. %s", path.toNativeString(), dep.name, p.name)); diff --git a/test/issue813-fixed-dependency.sh b/test/issue813-fixed-dependency.sh new file mode 100755 index 0000000..2785cdb --- /dev/null +++ b/test/issue813-fixed-dependency.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +cd ${CURR_DIR}/issue813-fixed-dependency +rm -rf main/.dub +rm -rf sub/.dub +rm -rf sub/sub/.dub +${DUB} build --bare --compiler=${DC} main || exit 1 diff --git a/test/issue813-fixed-dependency/.no_build b/test/issue813-fixed-dependency/.no_build new file mode 100644 index 0000000..8d1c8b6 --- /dev/null +++ b/test/issue813-fixed-dependency/.no_build @@ -0,0 +1 @@ + diff --git a/test/issue813-fixed-dependency/main/dub.sdl b/test/issue813-fixed-dependency/main/dub.sdl new file mode 100644 index 0000000..2faef96 --- /dev/null +++ b/test/issue813-fixed-dependency/main/dub.sdl @@ -0,0 +1,3 @@ +name "main" +targetType "executable" +dependency "sub" version="*" diff --git a/test/issue813-fixed-dependency/main/dub.selections.json b/test/issue813-fixed-dependency/main/dub.selections.json new file mode 100644 index 0000000..8443eed --- /dev/null +++ b/test/issue813-fixed-dependency/main/dub.selections.json @@ -0,0 +1,6 @@ +{ + "fileVersion": 1, + "versions": { + "sub": {"path": "../sub"} + } +} diff --git a/test/issue813-fixed-dependency/main/src/app.d b/test/issue813-fixed-dependency/main/src/app.d new file mode 100644 index 0000000..dde0c1e --- /dev/null +++ b/test/issue813-fixed-dependency/main/src/app.d @@ -0,0 +1,6 @@ +import sub.test; + +void main() +{ + foo(); +} diff --git a/test/issue813-fixed-dependency/sub/dub.sdl b/test/issue813-fixed-dependency/sub/dub.sdl new file mode 100644 index 0000000..f8bdac6 --- /dev/null +++ b/test/issue813-fixed-dependency/sub/dub.sdl @@ -0,0 +1,3 @@ +name "sub" +subPackage "sub/" +dependency ":sub" version="*" diff --git a/test/issue813-fixed-dependency/sub/sub/dub.sdl b/test/issue813-fixed-dependency/sub/sub/dub.sdl new file mode 100644 index 0000000..a932e26 --- /dev/null +++ b/test/issue813-fixed-dependency/sub/sub/dub.sdl @@ -0,0 +1 @@ +name "sub" diff --git a/test/issue813-fixed-dependency/sub/sub/src/sub/test.d b/test/issue813-fixed-dependency/sub/sub/src/sub/test.d new file mode 100644 index 0000000..fe5bb2c --- /dev/null +++ b/test/issue813-fixed-dependency/sub/sub/src/sub/test.d @@ -0,0 +1,6 @@ +module sub.test; + +void foo() +{ + +} \ No newline at end of file diff --git a/test/issue813-pure-sub-dependency.sh b/test/issue813-pure-sub-dependency.sh new file mode 100755 index 0000000..85ab84e --- /dev/null +++ b/test/issue813-pure-sub-dependency.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +cd ${CURR_DIR}/issue813-pure-sub-dependency +rm -rf main/.dub +rm -rf sub/.dub +rm -rf sub/sub/.dub +rm -f main/dub.selections.json +${DUB} build --bare --compiler=${DC} main || exit 1 diff --git a/test/issue813-pure-sub-dependency/.no_build b/test/issue813-pure-sub-dependency/.no_build new file mode 100644 index 0000000..8d1c8b6 --- /dev/null +++ b/test/issue813-pure-sub-dependency/.no_build @@ -0,0 +1 @@ + diff --git a/test/issue813-pure-sub-dependency/main/dub.sdl b/test/issue813-pure-sub-dependency/main/dub.sdl new file mode 100644 index 0000000..79f7d71 --- /dev/null +++ b/test/issue813-pure-sub-dependency/main/dub.sdl @@ -0,0 +1,3 @@ +name "main" +targetType "executable" +dependency "sub:sub" version="*" diff --git a/test/issue813-pure-sub-dependency/main/src/app.d b/test/issue813-pure-sub-dependency/main/src/app.d new file mode 100644 index 0000000..dde0c1e --- /dev/null +++ b/test/issue813-pure-sub-dependency/main/src/app.d @@ -0,0 +1,6 @@ +import sub.test; + +void main() +{ + foo(); +} diff --git a/test/issue813-pure-sub-dependency/sub/dub.sdl b/test/issue813-pure-sub-dependency/sub/dub.sdl new file mode 100644 index 0000000..f8bdac6 --- /dev/null +++ b/test/issue813-pure-sub-dependency/sub/dub.sdl @@ -0,0 +1,3 @@ +name "sub" +subPackage "sub/" +dependency ":sub" version="*" diff --git a/test/issue813-pure-sub-dependency/sub/sub/dub.sdl b/test/issue813-pure-sub-dependency/sub/sub/dub.sdl new file mode 100644 index 0000000..a932e26 --- /dev/null +++ b/test/issue813-pure-sub-dependency/sub/sub/dub.sdl @@ -0,0 +1 @@ +name "sub" diff --git a/test/issue813-pure-sub-dependency/sub/sub/src/sub/test.d b/test/issue813-pure-sub-dependency/sub/sub/src/sub/test.d new file mode 100644 index 0000000..fe5bb2c --- /dev/null +++ b/test/issue813-pure-sub-dependency/sub/sub/src/sub/test.d @@ -0,0 +1,6 @@ +module sub.test; + +void foo() +{ + +} \ No newline at end of file