diff --git a/source/dub/dub.d b/source/dub/dub.d index f6c6f59..a18857d 100644 --- a/source/dub/dub.d +++ b/source/dub/dub.d @@ -227,7 +227,9 @@ foreach (p; m_project.selections.selectedPackages) { auto dep = m_project.selections.getSelectedVersion(p); if (!dep.path.empty) { - try if (m_packageManager.getOrLoadPackage(dep.path)) continue; + auto path = dep.path; + if (!path.absolute) path = this.rootPath ~ path; + try if (m_packageManager.getOrLoadPackage(path)) continue; catch (Exception e) { logDebug("Failed to load path based selection: %s", e.toString().sanitize); } } else { if (m_packageManager.getPackage(p, dep.version_)) continue; @@ -288,7 +290,8 @@ return; } - foreach (p, ver; versions) { + foreach (p; versions.byKey) { + auto ver = versions[p]; // Workaround for DMD 2.070.0 AA issue (crashes in aaApply2 if iterating by key+value) assert(!p.canFind(":"), "Resolved packages contain a sub package!?: "~p); Package pack; if (!ver.path.empty) { diff --git a/source/dub/project.d b/source/dub/project.d index 72f67e5..85657a4 100644 --- a/source/dub/project.d +++ b/source/dub/project.d @@ -237,7 +237,32 @@ foreach (name, vspec_; pack.dependencies) { Dependency vspec = vspec_; Package p; - if (!vspec.path.empty) { + + auto basename = getBasePackageName(name); + if (name == m_rootPackage.basePackage.name) { + vspec = Dependency(m_rootPackage.ver); + p = m_rootPackage.basePackage; + } else if (basename == m_rootPackage.basePackage.name) { + vspec = Dependency(m_rootPackage.ver); + try p = m_packageManager.getSubPackage(m_rootPackage.basePackage, getSubPackageName(name), false); + catch (Exception e) { + logDiagnostic("Error getting sub package %s: %s", name, e.msg); + continue; + } + } else if (m_selections.hasSelectedVersion(basename)) { + vspec = m_selections.getSelectedVersion(basename); + p = m_packageManager.getBestPackage(name, vspec); + } 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(name), false); + } else { + logDiagnostic("Version selection for dependency %s (%s) of %s is missing.", + basename, name, pack.name); + } + + if (!p && !vspec.path.empty) { Path path = vspec.path; if (!path.absolute) path = pack.path ~ path; logDiagnostic("Adding local %s", path); @@ -253,33 +278,6 @@ } if (!p) { - auto basename = getBasePackageName(name); - if (name == m_rootPackage.basePackage.name) { - vspec = Dependency(m_rootPackage.ver); - p = m_rootPackage.basePackage; - } else if (basename == m_rootPackage.basePackage.name) { - vspec = Dependency(m_rootPackage.ver); - try p = m_packageManager.getSubPackage(m_rootPackage.basePackage, getSubPackageName(name), false); - catch (Exception e) { - logDiagnostic("Error getting sub package %s: %s", name, e.msg); - continue; - } - } else if (m_selections.hasSelectedVersion(basename)) { - vspec = m_selections.getSelectedVersion(basename); - p = m_packageManager.getBestPackage(name, vspec); - } 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(name), false); - } else { - logDiagnostic("Version selection for dependency %s (%s) of %s is missing.", - basename, name, pack.name); - continue; - } - } - - if (!p) { logDiagnostic("Missing dependency %s %s of %s", name, vspec, pack.name); continue; } diff --git a/test/issue754-path-selection-fail/a-1.0/dub.sdl b/test/issue754-path-selection-fail/a-1.0/dub.sdl new file mode 100644 index 0000000..7ff9fa1 --- /dev/null +++ b/test/issue754-path-selection-fail/a-1.0/dub.sdl @@ -0,0 +1,2 @@ +name "a" +version "1.0.0" diff --git a/test/issue754-path-selection-fail/a-1.0/source/a.d b/test/issue754-path-selection-fail/a-1.0/source/a.d new file mode 100644 index 0000000..0714d18 --- /dev/null +++ b/test/issue754-path-selection-fail/a-1.0/source/a.d @@ -0,0 +1,3 @@ +module a; + +void test() {} \ No newline at end of file diff --git a/test/issue754-path-selection-fail/a-2.0/dub.sdl b/test/issue754-path-selection-fail/a-2.0/dub.sdl new file mode 100644 index 0000000..1cb3694 --- /dev/null +++ b/test/issue754-path-selection-fail/a-2.0/dub.sdl @@ -0,0 +1,3 @@ +name "a" +version "2.0.0" + diff --git a/test/issue754-path-selection-fail/dub.sdl b/test/issue754-path-selection-fail/dub.sdl new file mode 100644 index 0000000..b36515c --- /dev/null +++ b/test/issue754-path-selection-fail/dub.sdl @@ -0,0 +1,2 @@ +name "test" +dependency "a" path="a-2.0" diff --git a/test/issue754-path-selection-fail/dub.selections.json b/test/issue754-path-selection-fail/dub.selections.json new file mode 100644 index 0000000..61e9539 --- /dev/null +++ b/test/issue754-path-selection-fail/dub.selections.json @@ -0,0 +1,6 @@ +{ + "fileVersion": 1, + "versions": { + "a": {"path": "a-1.0"} + } +} diff --git a/test/issue754-path-selection-fail/source/app.d b/test/issue754-path-selection-fail/source/app.d new file mode 100644 index 0000000..b248b89 --- /dev/null +++ b/test/issue754-path-selection-fail/source/app.d @@ -0,0 +1,6 @@ +import a; + +void main() +{ + test(); +}